采用以下示例:
>>> 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
参数的确切含义是什么?
答案 0 :(得分:17)
答案 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”“求和”,则是对所有行求和,并且输出将是具有相同列数的单行。 如果您对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
很容易被误导,因为在字典中,看起来y
和x
是两行。
如果从列表列表中生成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)
提示:考虑一词。