如何理解pandas(Python)中的axis = 0或1?

从文档中,“第一个垂直向下横跨行(轴0),第二个水平横跨列(轴1)”并且代码是

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') # by default axis=0

因为轴= 0(我解释为列)我认为concat只考虑在两个数据框中找到的列。 但是,acutal输出会考虑在两个数据框中找到的行(唯一的常见行元素'y')那么我应该如何正确理解axis = 0,1?


数据:

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

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

解释axis = 0将算法应用于每列,或者应用到行标签(索引)。这里有一个更详细的模式。

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

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

所以意思是把所有的列都放在x ,然后将它们连接在一起的行上,这些行将堆叠起来。 然而,这里x并不是到处都有,所以它不会保留最终结果。 这同样适用于z 。 对于y ,结果保留为y ,在所有数据框中。 这是你的结果。


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

但是,acutal输出会考虑在两个数据框中找到的行(唯一的常见行元素'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是用于连接一个速记(意味着在一系列或链连接在一起的这种方式[源])执行concat 沿着轴线0表示沿着轴线0连接两个对象。

   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功能呢? sum(axis=0)是什么意思?

假设数据看起来像

   1 2
   1 2
   1 2

也许...... 沿轴0求和,你可能会猜到。 是!!

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

那么dropna呢? 假设你有数据

   1  2  NaN
  NaN 3   5
   2  4   6

而你只想保持

2
3
4

在文档中,它表示返回对象的给定轴上的标签被忽略,其中交替地丢失了任何或全部数据

你应该把dropna(axis=0)还是dropna(axis=1) ? 考虑一下并尝试一下

df = pd.DataFrame([[1, 2, np.nan],
                   [np.nan, 3, 5],
                   [2, 4, 6]])

# df.dropna(axis=0) or df.dropna(axis=1) ?

提示:一起考虑这个词。

链接地址: http://www.djcxy.com/p/93003.html

上一篇: how to understand axis = 0 or 1 in pandas (Python)?

下一篇: Can't find package on Anaconda Navigator. What to do next?