Pandas Dataframe / Numpy Array“轴”定义中的歧义

我很困惑如何定义python轴,以及它们是否引用DataFrame的行或列。 考虑下面的代码:

>>> df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], columns=["col1", "col2", "col3", "col4"]) >>> df col1 col2 col3 col4 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 

所以如果我们调用df.mean(axis=1) ,我们将在行之间得到一个平均值:

 >>> df.mean(axis=1) 0 1 1 2 2 3 

但是,如果我们调用df.drop(name, axis=1) ,我们实际上删除了一列而不是一行:

 >>> df.drop("col4", axis=1) col1 col2 col3 0 1 1 1 1 2 2 2 2 3 3 3 

有人能帮我理解pandas / numpy / scipy中的“轴”是什么意思吗?

一个侧面说明, DataFrame.mean可能被定义为错误。 它在DataFrame.mean的文档中DataFrame.meanaxis=1应该表示列上的平均值,而不是行的平均值。

记住0 = down1 = across可能是最简单的。

意即:

  • 使用axis=0将每个列的方法应用到行标签(索引)上。
  • 使用axis=1在每一行或列标签上应用一种方法。

下面的图片显示了每个轴所指的DataFrame的部分:

记住Pandas遵循NumPy使用单词axis也是有用的。 用法在NumPy 术语表中解释 :

Axes是为具有多个维度的数组定义的。 二维数组有两个对应的轴:第一个垂直向下横跨行(轴0) ,第二个横向在列(轴1)水平延伸 。 [ 我的重点 ]

所以,关于问题中的方法, df.mean(axis=1)似乎是正确定义的。 它将水平跨过列的条目的平均值,即沿着每个单独的行。 另一方面, df.mean(axis=0)将是一个垂直向下行的操作。

同样, df.drop(name, axis=1)引用列标签上的一个操作,因为它们直观地穿过横轴。 指定axis=0会使该方法作用于行。

另一种解释方式是:

 // Not realistic but ideal for understanding the axis parameter df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], columns=["idx1", "idx2", "idx3", "idx4"], index=["idx1", "idx2", "idx3"] ) ---------------------------------------1 | idx1 idx2 idx3 idx4 | idx1 1 1 1 1 | idx2 2 2 2 2 | idx3 3 3 3 3 0 

关于df.drop (轴表示位置)

 A: I wanna remove idx3. B: **Which one**? // typing while waiting response: df.drop("idx3", A: The one which is on axis 1 B: OK then it is >> df.drop("idx3", axis=1) // Result ---------------------------------------1 | idx1 idx2 idx4 | idx1 1 1 1 | idx2 2 2 2 | idx3 3 3 3 0 

关于df.apply (轴表示方向)

 A: I wanna apply sum. B: Which direction? // typing while waiting response: df.apply(lambda x: x.sum(), A: The one which is on *parallel to axis 0* B: OK then it is >> df.apply(lambda x: x.sum(), axis=0) // Result idx1 6 idx2 6 idx3 6 idx4 6 

已经有正确的答案,但我给你另一个例子> 2维。

参数axis表示要改变的轴
例如,考虑有一个维度为axbxc的数据

  • df.mean(axis=1)返回一个尺寸为ax 1 xc的dataframe。
  • df.drop("col4", axis=1)返回一个尺寸为ax(b-1)xc的数据df.drop("col4", axis=1)

应该更广泛地知道可以使用string别名“index”“columns”来代替整数0/1。 别名更明确,帮助我记住计算如何发生。 'index'的另一个别名是'rows'

axis='index'被使用时,那么计算出现在列的下方,这是令人困惑的。 但是,我记得它得到的结果是与另一行相同的大小。

让我们在屏幕上获取一些数据,看看我在说什么:

 df = pd.DataFrame(np.random.rand(10, 4), columns=list('abcd')) abcd 0 0.990730 0.567822 0.318174 0.122410 1 0.144962 0.718574 0.580569 0.582278 2 0.477151 0.907692 0.186276 0.342724 3 0.561043 0.122771 0.206819 0.904330 4 0.427413 0.186807 0.870504 0.878632 5 0.795392 0.658958 0.666026 0.262191 6 0.831404 0.011082 0.299811 0.906880 7 0.749729 0.564900 0.181627 0.211961 8 0.528308 0.394107 0.734904 0.961356 9 0.120508 0.656848 0.055749 0.290897 

当我们想要取所有列的平均值时,我们使用axis='index'来得到以下结果:

 df.mean(axis='index') a 0.562664 b 0.478956 c 0.410046 d 0.546366 dtype: float64 

同样的结果将得到:

 df.mean() # default is axis=0 df.mean(axis=0) df.mean(axis='rows') 

要在行上从左到右使用操作,请使用axis ='columns'。 我记得通过认为可以将一个额外的列添加到我的DataFrame:

 df.mean(axis='columns') 0 0.499784 1 0.506596 2 0.478461 3 0.448741 4 0.590839 5 0.595642 6 0.512294 7 0.427054 8 0.654669 9 0.281000 dtype: float64 

同样的结果将得到:

 df.mean(axis=1) 

添加一个axis = 0 / index / rows的新行

让我们使用这些结果来添加额外的行或列来完成解释。 所以,无论何时使用axis = 0 / index / rows,就像得到一个DataFrame的新行一样。 我们来添加一行:

 df.append(df.mean(axis='rows'), ignore_index=True) abcd 0 0.990730 0.567822 0.318174 0.122410 1 0.144962 0.718574 0.580569 0.582278 2 0.477151 0.907692 0.186276 0.342724 3 0.561043 0.122771 0.206819 0.904330 4 0.427413 0.186807 0.870504 0.878632 5 0.795392 0.658958 0.666026 0.262191 6 0.831404 0.011082 0.299811 0.906880 7 0.749729 0.564900 0.181627 0.211961 8 0.528308 0.394107 0.734904 0.961356 9 0.120508 0.656848 0.055749 0.290897 10 0.562664 0.478956 0.410046 0.546366 

添加一个轴= 1 /列的新列

同样,当axis = 1 /列时,它将创build可以很容易地创build到自己的列中的数据:

 df.assign(e=df.mean(axis='columns')) abcde 0 0.990730 0.567822 0.318174 0.122410 0.499784 1 0.144962 0.718574 0.580569 0.582278 0.506596 2 0.477151 0.907692 0.186276 0.342724 0.478461 3 0.561043 0.122771 0.206819 0.904330 0.448741 4 0.427413 0.186807 0.870504 0.878632 0.590839 5 0.795392 0.658958 0.666026 0.262191 0.595642 6 0.831404 0.011082 0.299811 0.906880 0.512294 7 0.749729 0.564900 0.181627 0.211961 0.427054 8 0.528308 0.394107 0.734904 0.961356 0.654669 9 0.120508 0.656848 0.055749 0.290897 0.281000 

看来,你可以看到所有的别名与以下私有variables:

 df._AXIS_ALIASES {'rows': 0} df._AXIS_NUMBERS {'columns': 1, 'index': 0} df._AXIS_NAMES {0: 'index', 1: 'columns'}