关于python:pandas中的轴是什么意思?

What does axis in pandas mean?

以下是生成数据帧的代码:

1
2
3
4
import pandas as pd
import numpy as np

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

然后我得到了数据帧:

1
2
3
4
5
+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|
+------------+---------+--------+

当我键入命令时:

1
dff.mean(axis=1)

我得到:

1
2
0    1.074821
dtype: float64

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

1
2
3
A    0.626386
B    1.523255
dtype: float64

所以我的问题是:熊猫的轴心是什么意思?


它指定了计算平均值的轴。默认为axis=0。这与明确指定axis时的numpy.mean用法一致(在numpy.mean中,axis默认为none,它计算扁平数组的平均值),其中axis=0沿行(即pandas中的index),axis=1沿列。为了更加明确,可以选择指定axis='index'(而不是axis=0)或axis='columns'(而不是axis=1)。

1
2
3
4
5
6
7
8
+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|----axis=1----->
+------------+---------+--------+
             |         |
             | axis=0  |
             ↓         ↓


这些答案确实有助于解释这一点,但对于非程序员(即像我这样第一次在数据科学课程中学习Python的人)来说,仍然不是完全直观的。我仍然发现使用术语"沿"或"for each"会让行和列感到困惑。

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

  • 轴0将作用于每列中的所有行
  • 轴1将作用于每行中的所有列

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

最终,这句话和@zhangxaochen和@michael说的是一样的,但在某种程度上我更容易内化。


让我们想象一下(你永远都会记得)氧化镁

大熊猫:

  • 轴=0表示沿"索引"。这是逐行操作。
  • 假设要对dataframe1&dataframe2执行concat()操作,我们将从dataframe1中取出第一行并放入新的df,然后从dataframe1中取出另一行并放入新的df,重复此过程直到到达dataframe1的底部。然后,我们对数据框架2执行相同的过程。

    基本上,将数据帧2堆叠在数据帧1的顶部,反之亦然。

    例如在桌子或地板上做一堆书

  • 轴=1表示沿着"列"。这是一个列操作。
  • 假设要对dataframe1&dataframe2执行concat()操作,我们将取出数据帧1的第一个完整列(也就是第一个系列)并放入新的df中,然后取出数据帧1的第二列并保持相邻(侧面),我们必须重复此操作,直到所有列都完成。然后,我们在数据框架2上重复相同的过程。基本上,横向堆叠数据帧2。

    例如在书架上摆放书籍。

    More to it, since arrays are better representations to represent a nested n-dimensional structure compared to matrices! so below can help you more to visualize how axis plays an important role when you generalize to more than one dimension. Also, you can actually print/write/draw/visualize any n-dim array but, writing or visualizing the same in a matrix representation(3-dim) is impossible on a paper more than 3-dimensions.

    氧化镁


    axis是数组的维数,在pd.DataFrames axis=0是向下的维数,axis=1是向右的维数。

    例如:想象一个形状为(3,5,7)ndarray

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

    a是一个三维的ndarray,即它有三个轴("轴"是"轴"的复数)。a的外形看起来像3片面包,每片面包的尺寸为5×7。a[0,:,:]表示第0个切片,a[1,:,:]表示第1个切片等。

    a.sum(axis=0)将沿a的0轴应用sum()。您将添加所有切片,最后得到一个形状为(5,7)的切片。

    a.sum(axis=0)相当于

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

    ba.sum(axis=0)都是这样的

    1
    2
    3
    4
    5
    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.]])

    pd.DataFrame中,轴的工作方式与numpy.arrays中的工作方式相同:axis=0将对每个列应用sum()或任何其他约简函数。

    注意:在@zhangxaochen的回答中,我发现短语"沿着行"和"沿着列"有些混乱。axis=0应指"沿每列",axis=1应指"沿每行"。


    我最容易理解的方法是讨论您是计算每列(axis = 0还是每行(axis = 1的统计数据)。如果你用axis = 0计算一个统计值,比如平均值,你会得到每列的统计值。因此,如果每个观察值都是一行,并且每个变量都在一列中,那么您将得到每个变量的平均值。如果设置了axis = 1,则将计算每行的统计数据。在我们的示例中,您将获得所有变量的每次观察的平均值(可能需要相关度量的平均值)。

    axis = 0:按列=按列=沿行

    axis = 1:按行=按行=沿列


    编程视图中的轴是形状元组中的位置。下面是一个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import numpy as np

    a=np.arange(120).reshape(2,3,4,5)

    a.shape
    Out[3]: (2, 3, 4, 5)

    np.sum(a,axis=0).shape
    Out[4]: (3, 4, 5)

    np.sum(a,axis=1).shape
    Out[5]: (2, 4, 5)

    np.sum(a,axis=2).shape
    Out[6]: (2, 3, 5)

    np.sum(a,axis=3).shape
    Out[7]: (2, 3, 4)

    轴上的平均值将导致该尺寸被删除。

    参照原始问题,dff形状为(1,2)。使用轴=1会将形状更改为(1,)。


    熊猫的设计者韦斯·麦金尼(WesMcKinney)过去一直在集中研究金融数据。把列看作股票名称,把索引看作日价格。然后,您可以猜测与此财务数据相关的默认行为(即axis=0)。axis=1可以简单地认为是"另一个方向"。

    例如,统计功能,如mean()sum()describe()count()都默认为按列显示,因为这样做对每只股票更有意义。sort_index(by=)也默认为列。fillna(method='ffill')将沿列填充,因为它是相同的库存。dropna()默认为row,因为您可能只是想放弃当天的价格,而不是放弃该股票的所有价格。

    同样,方括号索引指的是列,因为选择股票而不是选择一天更常见。


    让我们看看wiki上的表格。这是国际货币基金组织对十大国家2010-2019年国内生产总值的估计。enter image description here

    1。如果您想计算十年(2010-2019年)内每个国家的平均(平均)国内生产总值(GDP),轴1将作用于所有列中的每一行,您需要这样做,df.mean(axis=1)。例如,如果要计算2010年至2019年美国的平均国内生产总值,df.loc['United States','2010':'2019'].mean(axis=1)

    2。如果我要计算所有国家每年的平均(平均)国内生产总值(GDP),轴0将作用于所有行的每一列,您需要这样做,df.mean(axis=0)。例如,如果你想计算美国、中国、日本、德国和印度的2015年平均国内生产总值,df.loc['United States':'India','2015'].mean(axis=0)。注:以上代码仅在使用set_index方法将"国家(或从属地区)"列设置为索引后才起作用。


    轴=0表示从上到下轴=1表示从左到右

    1
    sums[key] = lang_sets[key].iloc[:,1:].sum(axis=0)

    给出的示例是取列==key中所有数据的和。


    这是基于@safak的答案。理解pandas/numpy中的轴的最佳方法是创建一个3D数组,并检查沿3个不同轴的和函数的结果。

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

    A将是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        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.]]])

    现在,沿着每个轴查看数组元素的总和:

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

    将给出以下结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
       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.]])

    正确使用axis=的问题在于它适用于两种主要的不同情况:

  • 用于计算累积值或重新排列(如排序)数据。
  • 用于操作(播放)实体(如数据帧)。
  • 这个答案背后的主要思想是为了避免混淆,我们选择一个数字或一个名称来指定特定的轴,以更清晰、直观和描述性的为准。

    熊猫是以numpy为基础的,numpy是以数学为基础的,特别是以n维矩阵为基础的。这是一张在三维空间中常用于数学中轴名称的图像:

    氧化镁此图仅用于记忆轴的序号:

    • X轴为0
    • 用于Y轴的1,以及
    • 用于Z轴的2

    Z轴仅用于面板;对于数据帧,我们将把兴趣限制在具有X轴(0垂直)和Y轴(1水平)的绿色二维基本平面上。

    氧化镁数字是axis=参数的潜在值。

    轴的名称是'index'(您可以使用别名'rows')和'columns',对于这个解释来说,这些名称和轴的序数之间的关系并不重要,因为每个人都知道"行"和"列"的意思(我想这里的每个人都知道熊猫中的"索引"是什么意思)。

    现在,我的建议是:

  • 如果要计算累积值,可以从沿轴0(或沿轴1)的值计算它-使用axis=0axis=1

    同样,如果要重新排列值,请使用轴的轴号,该轴是用于重新排列的定位数据(例如用于排序)。

  • 如果要操作(例如连接)实体(例如数据帧),请使用axis='index'(同义词:axis='rows'axis='columns'分别指定所产生的更改-索引(行)或列。(对于连接,您将分别获得更长的索引(=更多的行)或更多的列。)


  • 我认为有另一种方式来理解它。

    对于一个np.array,如果我们想要消除列,我们使用axis=1;如果我们想要消除行,我们使用axis=0。

    1
    2
    3
    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,)

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


    我的想法是:轴=n,其中n=0,1,等等,意味着矩阵沿着该轴折叠(折叠)。所以在二维矩阵中,当沿着0(行)折叠时,实际上是一次操作一列。同样,对于高阶矩阵。

    这与对矩阵中维度的正常引用不同,其中0->行和1->列。与n维数组中的其他维度类似。


    我是熊猫的新手。但这就是我理解大熊猫轴心的方式:

    轴恒定变化方向

    0列行向下|

    向右1行列-->

    所以为了计算一列的平均值,这个列应该是常量,但是它下面的行可以改变(变化),所以它的轴是0。

    同样,要计算行的平均值,该特定行是常量,但它可以穿过不同的列(变化),轴=1。


    我这样理解:

    假设您的操作需要在数据帧中从左到右/从右到左进行遍历,那么显然您正在合并列,即在不同的列上操作。这是轴=1

    例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['A', 'B', 'C', 'D'])
    print(df)
       A  B   C   D
    0  0  1   2   3
    1  4  5   6   7
    2  8  9  10  11

    df.mean(axis=1)

    0    1.5
    1    5.5
    2    9.5
    dtype: float64

    df.drop(['A','B'],axis=1,inplace=True)

        C   D
    0   2   3
    1   6   7
    2  10  11

    Point to note here is we are operating on columns

    同样,如果您的操作需要在数据帧中从上到下/从下到上进行遍历,那么您正在合并行。这是轴=0。


    数组被设计成所谓的轴=0,行垂直放置,轴=1,列水平放置。轴是指数组的维度。Illustration