我对两个数据帧的合并有疑问。 我有一个数据帧,看起来像这样
>> print(df)
no value1 value2
0 a 0 -1
1 b -1 1
2 c -1 1
3 d 0 -1
4 e -1 -1
现在我有一个额外的数据框,看起来像这样
>> print(df2)
no value3 value4
0 a 1 -1
1 b 1 -1
2 e 1 -1
我想附加列" value3"和" value4"第二个数据帧到第一个数据帧,但只有在它们具有匹配值的情况下才会出现#34; no"柱。 所以最后我希望有一个最终的数据框,如下所示:
>> print(df)
no value1 value2 value3 value4
0 a 0 -1 1 -1
1 b -1 1 1 -1
2 c -1 1 NaN NaN
3 d 0 -1 NaN NaN
4 e -1 -1 1 -1
有一个简单的解决方案吗?谢谢你的帮助!
答案 0 :(得分:6)
将pd.concat
与set_index
一起使用,让Pandas使用内部数据对齐。
pd.concat([df.set_index('no'),df2.set_index('no')], axis=1).reset_index()
输出:
index value1 value2 value3 value4
0 a 0 -1 1.0 -1.0
1 b -1 1 1.0 -1.0
2 c -1 1 NaN NaN
3 d 0 -1 NaN NaN
4 e -1 -1 1.0 -1.0
答案 1 :(得分:3)
use merge
pd.merge(df, df2, on=['no'], how='outer')
no value1 value2 value3 value4
0 a 0 -1 1.0 -1.0
1 b -1 1 1.0 -1.0
2 c -1 1 NaN NaN
3 d 0 -1 NaN NaN
4 e -1 -1 1.0 -1.0
答案 2 :(得分:2)
您正在将列'no'
视为索引。如果是这样,您应该考虑将其放在索引中。
<强> pd.DataFrame.merge
强>
@ StevenG的回答是最惯用的,非常简单。问题是pd.DataFrame.merge
并不关心索引。它将生成一个具有应有值的新数据帧,但索引与那里没有相似之处。
df.set_index(df.index + 100)
no value1 value2
100 a 0 -1
101 b -1 1
102 c -1 1
103 d 0 -1
104 e -1 -1
当我这样做时,我想看到那些相同的索引值
pd.merge(df.set_index(df.index + 100), df2, on=['no'], how='left')
no value1 value2 value3 value4
0 a 0 -1 1.0 -1.0
1 b -1 1 1.0 -1.0
2 c -1 1 NaN NaN
3 d 0 -1 NaN NaN
4 e -1 -1 1.0 -1.0
但我不
<强> pd.concat 强>
@ ScottBoston也摧毁了该指数。优点在于它将'no'
列视为索引。如果它是唯一的,那么它可以提高大型数据帧(未经测试)的性能。
<强> pd.DataFrame.join
强>
我建议使用join
,因为它旨在处理索引。即使我们没有加入索引,我们也会保留那里的索引。
df.join(df2.set_index('no'), on='no')
no value1 value2 value3 value4
0 a 0 -1 1.0 -1.0
1 b -1 1 1.0 -1.0
2 c -1 1 NaN NaN
3 d 0 -1 NaN NaN
4 e -1 -1 1.0 -1.0
测试我们是否保护索引
df.set_index(df.index + 100).join(df2.set_index('no'), on='no')
no value1 value2 value3 value4
100 a 0 -1 1.0 -1.0
101 b -1 1 1.0 -1.0
102 c -1 1 NaN NaN
103 d 0 -1 NaN NaN
104 e -1 -1 1.0 -1.0
我们做到了!
答案 3 :(得分:1)
仅限于娱乐map
df2=df2.set_index('no')
for c in df2.columns:
df1[c] = df1['no'].map(df2[c]).values
Out[828]:
no value1 value2 value3 value4
0 a 0 -1 1.0 -1.0
1 b -1 1 1.0 -1.0
2 c -1 1 NaN NaN
3 d 0 -1 NaN NaN
4 e -1 -1 1.0 -1.0