2017-01-20 102 views
1

例如,如果第一數據幀df1是行:更改的第一數據幀的值與第二數據幀匹配蟒

 'a' 'b' 'value' 
0  1 2  1 
1  2 3  1 

和第二數據幀df2

 'a' 'b' 
0  1 2 

我想得到類似於

 'a' 'b' 'value' 
0  1 2  0 
1  2 3  1 

對於df1中的所有行(不包括'valu e'列)與df2中的行匹配,我想將df1中這些行的'value'列從1更改爲0.我可以使用df1.merge(df2, on=['a','b'])找到常見行。但是,我該如何改變價值?

+0

你能解釋一下你想要改變的值嗎?你可以做df1.merge(df2,on = ['a','b'])['vaule'] = new_values,我不確定這種改變是否會到位。 – rafaelvalle

回答

1

可以指定indicator參數爲真時merging,這將產生一個額外的列指定該行來自兩邊,然後可以修改基礎上,_merge列中的值列:

df_merge = df1.merge(df2, indicator=True, how = "left") 
df_merge["value"] = df_merge["value"].where(df_merge['_merge'] != "both", 0) 
df_merge.drop("_merge", axis=1) 

# a b value 
#0 1 2  0 
#1 2 3  1 

另一種選擇:

df1 = df1.set_index(['a', 'b']) 
df1.loc[df2.set_index(['a', 'b']).index, 'value'] = 0 
df1.reset_index() 

# a b value 
#0 1 2  0 
#1 2 3  1 
+0

嗨,第一個選項,你的意思是'df_merge [「value」] = df_merge [「value」]。其中(df_merge ['_ merge'] ==「both」,0)',因爲如果行存在兩個數據幀,我想將其值更改爲0. –

+0

嗯。然而,幾乎是,* pandas.Series.where *在條件爲真時保持該值,並且在條件爲假時取其他值(這裏爲0)。所以你想保留這個值,如果它是'left_only'。我知道這是一個有點直觀,但這是這個功能如何工作。 – Psidom

+1

是的,這是有點反直覺哈哈哈,我注意到,實施你的代碼時。反正非常感謝! :) –

0

您可以使用內部聯接找到共同的行。

df1.merge(df2, how= "inner", left_index= True, right_index= True) 

如果你想,那麼你張貼的輸出,您可以使用左連接

df2.merge(df1, how="left", left_index= True, right_index= True) 

您可以用零替換楠價值。

相關問題