2017-04-07 76 views
1

我有两个不同长度的熊猫数据框,当两列匹配时,我需要有条件地覆盖从一个到另一个的值。有条件地加入多个索引的熊猫DF

df1.val = df2.val where df1.val == null and df1.key1 == df2.key1 and df1.key2 == df2.key2 

df1df2具有非常不同的组列和行的长度,保存为key1key2val。唯一可以保证的是,df1中的每(key1, key2)df2中只有一个(key1, key2)

到目前为止,我一直走下去的

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 
+2

你可以添加一些数据样本的选择吗? – jezrael

回答

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包括来自dataframes

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 
+0

我不想填充所有空值,只是val列中的值。 –

+0

@SeanKramer在那里应该可以工作 – piRSquared

+0

如果你想要替换null和0值,你会如何处理它? –