有条件地在多个索引上加入pandas DF

时间:2017-04-07 19:55:12

标签: python pandas join dataframe

我有两个不同长度的pandas数据帧,当两列匹配时,我需要有条件地将值从一个覆盖到另一个。

df1.val = df2.val where df1.val == null and df1.key1 == df2.key1 and df1.key2 == df2.key2
df1df2key1外,

key2val具有非常不同的列和行长度集。唯一能保证的是,对于(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

1 个答案:

答案 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