以下是我生成数据框的代码:
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
所以这是我的问题:熊猫的轴是什么意思?
答案 0 :(得分:298)
它指定轴>>计算平均值。默认情况下为axis=0
。这与numpy.mean
在axis
明确指定时的使用情况一致numpy.mean
,默认情况下,轴==无,这会计算平展的平均值数组),其中行中的axis=0
(即pandas中的 index )和列中的axis=1
。为了更加清晰,可以选择指定axis='index'
(而不是axis=0
)或axis='columns'
(而不是axis=1
)。
+------------+---------+--------+
| | A | B |
+------------+---------+---------
| 0 | 0.626386| 1.52325|----axis=1----->
+------------+---------+--------+
| |
| axis=0 |
↓ ↓
答案 1 :(得分:57)
这些答案确实有助于解释这一点,但对于非程序员(即像我这样的人,在数据科学课程的背景下第一次学习Python),它仍然不是非常直观。我仍然发现使用术语“沿”或“对于每个”wrt行和列是混乱的。
对我来说更有意义的是这样说:
因此,轴0上的平均值将是每列中所有行的平均值,轴1上的平均值将是每行中所有列的平均值。
最终,这与@ zhangxaochen和@Michael的说法相同,但是我更容易内化。
答案 2 :(得分:31)
在熊猫:
假设在dataframe1&上执行concat()操作。 dataframe2, 我们将采用dataframe1&从dataframe1取出第一行并放入新的DF,然后我们从dataframe1取出另一行并放入新的DF,我们重复这个过程,直到我们到达dataframe1的底部。然后,我们对dataframe2执行相同的过程。
基本上,将dataframe2堆叠在dataframe1之上,反之亦然。
例如在桌子或地板上制作一堆书
假设在dataframe1&上执行concat()操作。 dataframe2, 我们将拿出第一个完整列(又名第一系列)dataframe1并放入新DF,然后我们取出第二列dataframe1并保持与它相邻(侧面),我们必须重复此操作,直到完成所有列。然后,我们在dataframe2上重复相同的过程。 基本上, 横向堆叠dataframe2。
例如在书架上安排书籍。
更多的是,因为与矩阵相比,数组是更好的表示来表示嵌套的n维结构!因此,当您推广到多个维度时,下面可以帮助您更多地可视化轴如何发挥重要作用。此外,您实际上可以打印/写入/绘制/可视化任何n-dim数组,但是在超过3维的纸张上,无法以矩阵表示(3-dim)书写或可视化相同的数组。
答案 3 :(得分:26)
axis
是指数组的维度,在pd.DataFrame
s axis=0
的情况下,axis=1
是指向下方的维度,ndarray
是指向右侧的维度。
示例:想一下形状为(3,5,7)
的{{1}}。
a = np.ones((3,5,7))
a
是3维ndarray
,即它具有 3轴(“轴”是“轴”的复数)。 a
的配置看起来像3片面包,每片的尺寸为5×7。 a[0,:,:]
将引用第0个切片,a[1,:,:]
将引用第1个切片等。
a.sum(axis=0)
将沿sum()
的第0轴应用a
。您将添加所有切片,最后得到一片形状(5,7)
。
a.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(axis=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.]])
在pd.DataFrame
中,轴的工作方式与numpy.array
中的相同:axis=0
将为每列应用sum()
或任何其他缩减功能。
N.B。在@ zhangxaochen的回答中,我发现“沿着行”和“沿着列”这两个短语略显混乱。 axis=0
应该引用“沿着每一列”,并且axis=1
“沿着每一行”。
答案 4 :(得分:21)
让我理解的最简单方法是讨论您是为每列(axis = 0
)还是每行(axis = 1
)计算统计数据。如果您使用axis = 0
计算统计数据(比如均值),您将获得每列的统计数据。因此,如果每个观察都是一行,并且每个变量都在一列中,您将获得每个变量的平均值。如果您设置axis = 1
,那么您将计算每行的统计信息。在我们的示例中,您将获得所有变量中每个观察值的均值(可能您需要相关度量的平均值)。
axis = 0
:by column = column-wise =沿着行
axis = 1
:by row = row-wise =沿列
答案 5 :(得分:9)
考虑到编程的轴是形状元组中的位置。这是一个例子:
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)。使用axis = 1会将形状更改为(1,)。
答案 6 :(得分:8)
熊猫的设计师Wes McKinney过去常常专注于财务数据。将列视为股票名称和索引作为每日价格。然后,您可以猜测此财务数据的默认行为(即axis=0
)。 axis=1
可以被简单地视为另一个方向'。
例如,统计函数(例如mean()
,sum()
,describe()
,count()
都默认为列式,因为执行它们更有意义每个股票。 sort_index(by=)
也默认为列。 fillna(method='ffill')
将填充列,因为它是相同的库存。 dropna()
默认为行,因为您可能只想丢弃当天的价格而不是丢弃该股票的所有价格。
同样,方括号索引是指列,因为选择股票而不是选择一天更常见。
答案 7 :(得分:2)
让我们看一下Wiki中的表格。这是国际货币基金组织对2010年至2019年前十个国家GDP的估计。
1。第1轴将在所有列的每一行上起作用
如果要计算十年(2010-2019年)中每个国家的平均(平均)GDP,则需要做{{1 }}。例如,如果您要计算2010年至2019年美国的平均GDP,def numbers_to_strings(a1):
switcher = {
1: push,
2: pop,
3: display,
4: quit
}
return switcher.get(a1, "nothing")() # get the function object, then evalutate
2。轴0将对所有行中的每一列起作用
如果我想计算所有国家/地区每个年份的平均(平均)GDP,则需要执行df.mean(axis=1)
。例如,如果您要计算美国,中国,日本,德国和印度的2015年平均GDP,df.loc['United States','2010':'2019'].mean(axis=1)
注意:以上代码仅在使用df.mean(axis=0)
方法将“国家(或从属地区)”列设置为索引后才有效。
答案 8 :(得分:1)
轴= 0表示向上到向下 axis = 1表示从左到右
sums[key] = lang_sets[key].iloc[:,1:].sum(axis=0)
给出的例子是在列==键中获取所有数据的总和。
答案 9 :(得分:1)
这是基于@Safak的答案。 理解pandas / numpy中轴的最好方法是创建一个3d数组,并检查3个不同轴上sum函数的结果。
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.]])
答案 10 :(得分:1)
答案 11 :(得分:1)
正确使用axis=
的问题在于它可用于两种主要的不同情况:
此答案的主要思想是为了避免混淆,我们选择 number 或 name 来指定特定轴,更加清晰,直观和描述性。
Pandas基于NumPy,它基于数学,尤其是基于n维矩阵。这是3维空间中数学中轴名称的常用图像:
0
用于x轴,1
(用于y轴)和2
(用于z轴)。 z轴仅用于面板;对于数据帧,我们会将兴趣限制在带有 x轴(0
,垂直)的绿色,二维基本平面 和 y轴(1
,水平)。
轴的名称是'index'
(您可以使用别名'rows'
)和'columns'
,对于此解释并不重要这些名称与(轴的)序数之间的关系,因为每个人都知道“行” 和“列” 这两个词的含义(而每个人在这里-我想-知道熊猫中“索引” 的意思。
现在,我的建议:
如果要计算累加值,则可以根据位于沿轴0 (或沿沿轴1 )的值进行计算>)-使用axis=0
(或axis=1
)。
类似地,如果您要重新排列值,请使用轴的轴号,以及是要重新排列的数据(例如用于排序)。
如果要操作(例如连接)实体(例如数据框),请使用axis='index'
(同义词:axis='rows'
)或axis='columns'
指定结果更改-索引(行 )或列。
(对于串联,您将分别获得更长的索引(=更多的行)或更多的列。)
答案 12 :(得分:0)
例如,如果您使用 df.shape,那么您将获得一个包含数据框中行数和列数的元组作为输出。
In [10]: movies_df.shape
Out[10]: (1000, 11)
在上面的示例中,电影数据框中有 1000 行和 11 列,其中在元组的索引 0 位置和索引 1 位置中提到了“行”和“列”。因此,'axis=1' 表示列,'axis=0' 表示行。
信用:Github
答案 13 :(得分:0)
这里的许多答案对我有很大帮助!
如果您对Python中的axis
和R中的MARGIN
的不同行为感到困惑(例如在apply
函数中),您可能会发现我写的一篇博客文章兴趣:https://accio.github.io/programming/2020/05/19/numpy-pandas-axis.html。
本质上:
numpy
和pandas
中,sum的axis参数实际上指定numpy,以计算可以以array [0,0,...形式获取的所有值的均值。 ,i,...,0],在其中迭代所有可能的值。在i的位置固定的情况下重复此过程,其他维度的索引则一个接一个地变化(从最右边的元素开始)。结果是一个n维数组。apply
函数计算可以以array [,...,i,...,]的形式获取的所有值的平均值,其中i遍历所有可能的值。迭代完所有i值后,不再重复该过程。因此,结果是一个简单的向量。答案 14 :(得分:0)
我也一直在试图找出最后一个小时的轴。以上所有答案中的语言以及文档都根本没有帮助。
要回答我现在所理解的问题,在Pandas中,axis = 1或0表示在应用该函数时要保持哪个轴头。
注意:当我说标题时,我指的是索引名称
扩展您的示例:
+------------+---------+--------+
| | A | B |
+------------+---------+---------
| X | 0.626386| 1.52325|
+------------+---------+--------+
| Y | 0.626386| 1.52325|
+------------+---------+--------+
对于axis = 1 = columns:我们保持列标题不变,并通过更改数据应用均值函数。 为了演示,我们将列标题保持不变:
+------------+---------+--------+
| | A | B |
现在我们填充一组A和B值,然后找到均值
| | 0.626386| 1.52325|
然后我们填充下一组A和B值并找到均值
| | 0.626386| 1.52325|
类似地,对于axis = rows,我们保持行标题不变,并不断更改数据: 为了演示,请首先修复行标题:
+------------+
| X |
+------------+
| Y |
+------------+
现在填充第一组X和Y值,然后找到均值
+------------+---------+
| X | 0.626386
+------------+---------+
| Y | 0.626386
+------------+---------+
然后填充下一组X和Y值,然后找到均值:
+------------+---------+
| X | 1.52325 |
+------------+---------+
| Y | 1.52325 |
+------------+---------+
总而言之,
当axis = columns时,您将固定列标题并更改数据,这些数据将来自不同的行。
当axis = rows时,您可以修复行标题并更改数据,这些数据将来自不同的列。
答案 15 :(得分:0)
由于人们可能会以完全错误的方式解释它们,因此我将明确避免使用“按行”或“沿列”。
首先是类比。直观地,您会期望pandas.DataFrame.drop(axis='column')
从N列中删除一列,并为您提供(N-1)列。因此,您现在无需关注行(并从英语词典中删除单词“ row”。)反之亦然,drop(axis='row')
适用于行。
以同样的方式,sum(axis='column')
在多列上工作,并为您提供1列。同样,sum(axis='row')
排成1行。这与最简单的定义形式一致,将数字列表减少为一个数字。
通常,使用axis=column
,您可以看到列,处理列并获取列。忘记行。
使用axis=row
,可以更改视角并处理行。
0和1只是'row'和'column'的别名。这是矩阵索引的惯例。
答案 16 :(得分:0)
记住轴1(列)和轴0(行)的简单方法之一就是您期望的输出。如果您希望每行的输出都使用axis ='columns',另一方面,如果您希望每行的输出都使用axis ='rows'。
答案 17 :(得分:0)
我认为还有另一种理解方式。
对于np.array,如果要消除列,则使用axis = 1;如果要消除行,则使用轴= 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
答案 18 :(得分:0)
我这样理解:
说,如果您的操作需要在数据框中从从左向右/从右向左遍历,则显然是在合并列,即。您正在各种列上进行操作。
这是轴= 1
示例
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
要注意的是我们正在对列进行操作
类似地,如果您的操作需要在数据框中从顶部到底部/从底部到顶部遍历,则您正在合并行。这是轴= 0 。
答案 19 :(得分:0)
我是熊猫的新手。但这就是我理解熊猫轴的方式:
轴 恒定 变化 方向
0列向下排|
向右1行列->
因此,要计算列的均值,该特定列应为恒定,但其下的行可以更改(变化),因此轴= 0。>
类似地,要计算一行的均值,该特定行是恒定,但它可以遍历不同的列(不同),轴= 1。
答案 20 :(得分:0)
我的想法:Axis = n,其中n = 0,1等等意味着矩阵沿着该轴折叠(折叠)。因此,在2D矩阵中,当您沿0(行)折叠时,您实际上一次只能在一列上操作。类似地,对于高阶矩阵。
这与矩阵中维度的常规引用不同,其中0 - >行和1 - >柱。类似地,对于N维数组中的其他维度。
答案 21 :(得分:-3)
阵列设计时所谓的轴= 0,行垂直位于轴= 1,列位于水平位置。轴指的是数组的维数。