下面是我生成一个数据框架的代码:

import pandas as pd
import numpy as np

dff = pd.DataFrame(np.random.randn(1,2),columns=list('AB'))

然后我得到了数据框架:

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|
+------------+---------+--------+

当我输入命令时:

dff.mean(axis=1)

我得到:

0    1.074821
dtype: float64

根据pandas的参考,axis=1代表列,我希望命令的结果是

A    0.626386
B    1.523255
dtype: float64

我的问题是:轴在熊猫中是什么意思?


当前回答

这些答案确实有助于解释这一点,但对于非程序员(例如,像我这样第一次在数据科学课程背景下学习Python的人)来说,它仍然不是完全直观的。我仍然发现使用术语“沿着”或“每个”wrt的行和列是令人困惑的。

对我来说更有意义的是这样说:

轴0将作用于每个COLUMN中的所有row 轴1将作用于每个ROW中的所有COLUMNS

0轴上的均值是每列中所有行的均值,1轴上的均值是每行中所有列的均值。

从根本上说,这和@zhangxaochen和@Michael的意思是一样的,只是用一种更容易让我内化的方式。

其他回答

我将明确避免使用“行-wise”或“沿列”,因为人们可能会以完全错误的方式解释它们。

类比。直观地,你会期望pandas. datafframe .drop(axis='column')从N个列中删除一个列,并给出(N - 1)个列。所以你现在可以不关注rows(并从你的英语字典中删除row这个单词)。反之亦然,drop(axis='row')作用于行。

以同样的方式,sum(axis='column')在多个列上工作,并给出1列。类似地,sum(axis='row')的结果为1行。这与其最简单的定义形式是一致的,即将一组数字简化为一个数字。

一般来说,使用axis=column,您可以看到列,处理列,并获得列。忘记行。

使用axis=row,改变视角并在行上工作。

0和1只是“行”和“列”的别名。这是矩阵下标的惯例。

我认为还有另一种理解方式。

对于np。数组,如果我们想要消除列,我们使用axis = 1;如果我们想消除行,我们使用axis = 0。

np.mean(np.array(np.ones(shape=(3,5,10))),axis = 0).shape # (5,10)
np.mean(np.array(np.ones(shape=(3,5,10))),axis = 1).shape # (3,10)
np.mean(np.array(np.ones(shape=(3,5,10))),axis = (0,1)).shape # (10,)

对于pandas对象,axis = 0表示按行操作,axis = 1表示按列操作。这与numpy的定义不同,我们可以检查numpy.doc和pandas.doc的定义

Axis指的是数组的维度,在pd的情况下。DataFrames轴=0是指向下方的维度,轴=1是指向右侧的维度。

示例:考虑一个形状为(3,5,7)的ndarray。

a = np.ones((3,5,7))

A是一个三维ndarray,即它有3个轴(“axis”是“axis”的复数)。a的构型看起来就像3片面包每片的尺寸都是5乘7。A[0,:,:]表示第0个切片,A[1,:,:]表示第1个切片,等等。

a.s sum(axis=0)将沿着a的第0个轴应用sum()。你将添加所有的切片,最终得到一个形状(5,7)的切片。

a.s sum(axis=0)等价于

b = np.zeros((5,7))
for i in range(5):
    for j in range(7):
        b[i,j] += a[:,i,j].sum()

B和a.sum(轴=0)看起来都是这样的

array([[ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.]])

在警局里。DataFrame,轴的工作方式与numpy相同。数组:axis=0将对每一列应用sum()或任何其他约简函数。

注意:在@zhangxaochen的回答中,我发现“沿着行”和“沿着列”这两个短语有点让人困惑。Axis =0表示“沿每列”,Axis =1表示“沿每行”。

它指定了计算平均值的轴。默认情况下axis=0。这与numpy一致。显式指定axis时的平均使用量(在numpy中)。mean, axis==None,默认情况下,它计算扁平数组上的平均值),其中,沿行轴=0(即,以pandas为单位的索引),沿列轴=1。为了增加清晰度,可以选择指定axis='index'(而不是axis=0)或axis='columns'(而不是axis=1)。

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|----axis=1----->
+------------+---------+--------+
             |         |
             | axis=0  |
             ↓         ↓

这是基于@Safak的回答。 理解pandas/numpy中的轴的最好方法是创建一个3d数组,并沿着3个不同的轴检查求和函数的结果。

 a = np.ones((3,5,7))

A将是:

    array([[[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]],

   [[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]],

   [[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]]])

现在检查数组中每个轴上元素的和:

 x0 = np.sum(a,axis=0)
 x1 = np.sum(a,axis=1)
 x2 = np.sum(a,axis=2)

会给你以下结果:

   x0 :
   array([[3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.],
        [3., 3., 3., 3., 3., 3., 3.]])

   x1 : 
   array([[5., 5., 5., 5., 5., 5., 5.],
   [5., 5., 5., 5., 5., 5., 5.],
   [5., 5., 5., 5., 5., 5., 5.]])

  x2 :
   array([[7., 7., 7., 7., 7.],
        [7., 7., 7., 7., 7.],
        [7., 7., 7., 7., 7.]])