我有两个不同长度的pandas数据帧,当两列匹配时,我需要有条件地将值从一个覆盖到另一个。
df1.val = df2.val where df1.val == null and df1.key1 == df2.key1 and df1.key2 == df2.key2
除df1
,df2
和key1
外, key2
和val
具有非常不同的列和行长度集。唯一能保证的是,对于(key1, key2)
中的每个df1
,(key1, key2)
中只有一个df2
。
到目前为止,我一直走在
的道路上df1.loc[df1.val.isnull(), "val"] = df2.val
尝试将索引设置为匹配,但我还没有得到任何答案。
我知道有一些加入,但我在这方面也没有取得任何进展。一些句法帮助将不胜感激。
编辑数据:
DF1:
First Last Val Random1 ...
John Smith 4 x
Todd Smith 5 Nan
John Todd Nan z
DF2:
First Last Val Random2 ...
John Smith 7 4
Todd Smith 6 9
John Todd 3 3
Eric Smith 5 2
结果:
First Last Val Random1 ...OtherDF1Cols...
John Smith 4 x
Todd Smith 5 Nan
John Todd 3 z
答案 0 :(得分:1)
首先设置索引,然后设置fillna
DF1.set_index(['First', 'Last']).fillna(DF2.set_index(['First', 'Last']))
Val
First Last
John Smith 4.0
Todd Smith 5.0
John Todd 3.0
使用combine_first
包含两个数据框中的所有内容
DF1.set_index(['First', 'Last']).combine_first(DF2.set_index(['First', 'Last']))
Val
First Last
Eric Smith 5.0
John Smith 4.0
Todd 3.0
Todd Smith 5.0
或者,只更新Val
列,并限制为仅显示第一行
d1 = DF1.set_index(['First', 'Last'])
d2 = DF2.set_index(['First', 'Last'])
print(d1.combine_first(d2[['Val']]).loc[d1.index].reset_index())
First Last Val
0 John Smith 4.0
1 Todd Smith 5.0
2 John Todd 3.0
使用update
d1 = DF1.set_index(['First', 'Last'])
d2 = DF2.set_index(['First', 'Last'])
d1.update(d2.Val, overwrite=False)
d1.reset_index()
First Last Val
0 John Smith 4.0
1 Todd Smith 5.0
2 John Todd 3.0