Pandas DataFrame中"axis"属性的含义是什么?

lxd*_*ler 20 python axis dataframe pandas

以下面的例子为例:

>>> df1 = pd.DataFrame({"x":[1, 2, 3, 4, 5], 
                        "y":[3, 4, 5, 6, 7]}, 
                      index=['a', 'b', 'c', 'd', 'e'])

>>> df2 = pd.DataFrame({"y":[1, 3, 5, 7, 9], 
                        "z":[9, 8, 7, 6, 5]}, 
                      index=['b', 'c', 'd', 'e', 'f'])

>>> pd.concat([df1, df2], join='inner')
Run Code Online (Sandbox Code Playgroud)

输出是:

   y
a  3
b  4
c  5
d  6
e  7
b  1
c  3
d  5
e  7
f  9
Run Code Online (Sandbox Code Playgroud)

由于axis=0是列,我认为concat()只考虑在两个数据帧中找到的.但是,实际输出会考虑在两个数据帧中找到的.

axis参数的确切含义是什么?

deb*_*e4u 25

如果有人需要视觉描述,这里是图像:

Pandas Python中的轴0或1


Max*_*axU 12

数据:

In [55]: df1
Out[55]:
   x  y
a  1  3
b  2  4
c  3  5
d  4  6
e  5  7

In [56]: df2
Out[56]:
   y  z
b  1  9
c  3  8
d  5  7
e  7  6
f  9  5
Run Code Online (Sandbox Code Playgroud)

水平连接(轴= 1),使用在两个DF中找到的索引元素(通过索引进行对齐以进行连接):

In [57]: pd.concat([df1, df2], join='inner', axis=1)
Out[57]:
   x  y  y  z
b  2  4  1  9
c  3  5  3  8
d  4  6  5  7
e  5  7  7  6
Run Code Online (Sandbox Code Playgroud)

垂直连接(DEFAULT:axis = 0),使用两个DF中的:

In [58]: pd.concat([df1, df2], join='inner')
Out[58]:
   y
a  3
b  4
c  5
d  6
e  7
b  1
c  3
d  5
e  7
f  9
Run Code Online (Sandbox Code Playgroud)

如果你不使用innerjoin方法 - 你会这样:

In [62]: pd.concat([df1, df2])
Out[62]:
     x  y    z
a  1.0  3  NaN
b  2.0  4  NaN
c  3.0  5  NaN
d  4.0  6  NaN
e  5.0  7  NaN
b  NaN  1  9.0
c  NaN  3  8.0
d  NaN  5  7.0
e  NaN  7  6.0
f  NaN  9  5.0

In [63]: pd.concat([df1, df2], axis=1)
Out[63]:
     x    y    y    z
a  1.0  3.0  NaN  NaN
b  2.0  4.0  1.0  9.0
c  3.0  5.0  3.0  8.0
d  4.0  6.0  5.0  7.0
e  5.0  7.0  7.0  6.0
f  NaN  NaN  9.0  5.0
Run Code Online (Sandbox Code Playgroud)


小智 5

这是我使用轴的技巧:只需在脑海中添加操作即可使声音清晰:

  • 轴0 =行
  • 轴1 =列

如果通过axis = 0"求和",则对所有行求和,输出将是具有相同列数的单行.如果通过axis = 1"求和",则对所有列求和,输出将是具有相同行数的单个列.


Bou*_*oud 3

解释 axis=0 以将算法应用于每列,或应用于行标签(索引)。更详细的模式请参见此处

如果您将一般解释应用于您的案例,那么这里的算法是concat。因此对于 axis=0,这意味着:

对于每一列,将所有行向下(跨越 的所有数据帧concat),并在它们相同时联系它们(因为您选择了join=inner)。

因此,其含义是获取所有列x并将它们连接到行上,从而将每个行块一个接一个地堆叠起来。然而,这里x并不存在于所有地方,所以它不会被保留用于最终结果。这同样适用于z. 因为y结果y在所有数据帧中保持原样。这就是你得到的结果。