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 |
所以我的问题是:熊猫的轴心是什么意思?
它指定了计算平均值的轴。默认为
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说的是一样的,但在某种程度上我更容易内化。
让我们想象一下(你永远都会记得)氧化镁
大熊猫:
假设要对dataframe1&dataframe2执行concat()操作,我们将从dataframe1中取出第一行并放入新的df,然后从dataframe1中取出另一行并放入新的df,重复此过程直到到达dataframe1的底部。然后,我们对数据框架2执行相同的过程。
基本上,将数据帧2堆叠在数据帧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.
号
氧化镁
例如:想象一个形状为
1 | a = np.ones((3,5,7)) |
号
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() |
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.]]) |
。
在
注意:在@zhangxaochen的回答中,我发现短语"沿着行"和"沿着列"有些混乱。
我最容易理解的方法是讨论您是计算每列(
编程视图中的轴是形状元组中的位置。下面是一个例子:
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)过去一直在集中研究金融数据。把列看作股票名称,把索引看作日价格。然后,您可以猜测与此财务数据相关的默认行为(即
例如,统计功能,如
同样,方括号索引指的是列,因为选择股票而不是选择一天更常见。
让我们看看wiki上的表格。这是国际货币基金组织对十大国家2010-2019年国内生产总值的估计。。
1。如果您想计算十年(2010-2019年)内每个国家的平均(平均)国内生产总值(GDP),轴1将作用于所有列中的每一行,您需要这样做,
2。如果我要计算所有国家每年的平均(平均)国内生产总值(GDP),轴0将作用于所有行的每一列,您需要这样做,
轴=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.]]) |
正确使用
这个答案背后的主要思想是为了避免混淆,我们选择一个数字或一个名称来指定特定的轴,以更清晰、直观和描述性的为准。
熊猫是以numpy为基础的,numpy是以数学为基础的,特别是以n维矩阵为基础的。这是一张在三维空间中常用于数学中轴名称的图像:
氧化镁此图仅用于记忆轴的序号:
- X轴为
0 , - 用于Y轴的
1 ,以及 - 用于Z轴的
2 。
Z轴仅用于面板;对于数据帧,我们将把兴趣限制在具有X轴(
氧化镁数字是
轴的名称是
现在,我的建议是:
如果要计算累积值,可以从沿轴0(或沿轴1)的值计算它-使用
同样,如果要重新排列值,请使用轴的轴号,该轴是用于重新排列的定位数据(例如用于排序)。
如果要操作(例如连接)实体(例如数据帧),请使用
我认为有另一种方式来理解它。
对于一个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,) |
对于熊猫对象,
我的想法是:轴=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,列水平放置。轴是指数组的维度。。