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

时间:2016-09-02 02:11:14

标签: python pandas dataframe axis

采用以下示例:

>>> 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')

输出结果为:

   y
a  3
b  4
c  5
d  6
e  7
b  1
c  3
d  5
e  7
f  9

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

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

5 个答案:

答案 0 :(得分:17)

如果有人需要视觉描述,则图像如下:

Axis 0 or 1 in Pandas Python

答案 1 :(得分:11)

数据:

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

连接水平(轴= 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

连接垂直(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

如果您不使用inner加入方法 - 您将采用这种方式:

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

答案 2 :(得分:5)

这是我使用轴的技巧:只需在您的脑海中添加操作即可使其听起来清晰:

  • 轴0 =行
  • 轴1 =列

如果通过“轴= 0”“求和”,则是对所有行求和,并且输出将是具有相同列数的单行。 如果您对axis = 1进行“求和”,那么您将对所有列求和,并且输出将是具有相同行数的单列。

答案 3 :(得分:3)

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

如果您对该案例应用该一般解释,则此算法为concat。因此,对于axis = 0,它意味着:

每列的

,将所有行向下(跨concat的所有数据框),并在它们共同时(因为您选择了join=inner)与它们联系。

所以意思是取所有列x并将它们连接起来,这些行将一个接一个地堆叠每一行。但是,此处x并不存在,因此不会保留最终结果。这同样适用于z。对于y,结果将保留为y在所有数据框中。这是你的结果。

答案 4 :(得分:3)

首先,OP误解了他/她的数据帧中的行和列。

  

但是,uutal输出会考虑在两个数据帧中找到的行。(唯一的常见行元素'y')

OP认为标签y用于行。但是,y是列名。

df1 = pd.DataFrame(
         {"x":[1, 2, 3, 4, 5],  # <-- looks like row x but actually col x
          "y":[3, 4, 5, 6, 7]}, # <-- looks like row y but actually col y
          index=['a', 'b', 'c', 'd', 'e'])
print(df1)

            \col   x    y
 index or row\
          a       1     3   |   a
          b       2     4   v   x
          c       3     5   r   i
          d       4     6   o   s
          e       5     7   w   0

               -> column
                 a x i s 1

很容易被误导,因为在字典中,看起来yx是两行。

如果从列表列表中生成df1,则应该更直观:

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

回到问题所在,concat连接的简写(意味着以这种方式链接在一个系列或链中[source])执行{{1} } 沿轴0表示链接两个沿轴0的对象。

concat

所以......觉得你现在有这种感觉。大熊猫的sum功能怎么样? 1 1 <-- series 1 1 ^ ^ ^ | | | 1 c a a 1 o l x 1 n o i gives you 2 c n s 2 a g 0 2 t | | | V V v 2 2 <--- series 2 2 的含义是什么?

假设数据类似于

sum(axis=0)

也许......总结沿着轴0,你可能猜到了。是!!

   1 2
   1 2
   1 2

dropna怎么样?假设你有数据

^  ^  ^
|  |  |               
s  a  a               
u  l  x                
m  o  i   gives you two values 3 6 !
|  n  s               
v  g  0               
   |  |
   V  V

你只想保留

   1  2  NaN
  NaN 3   5
   2  4   6

在文档中,它说返回对象,其中给定轴上的标签被省略,其中交替显示任何或所有数据

你应该放2 3 4 还是dropna(axis=0)?想一想,然后尝试

dropna(axis=1)

提示:考虑一词