2017-02-20 69 views
2

我有一些麻煩,比較在路兩個dataframes我想:比較dataframes的某些列的交叉點大小不同

df1=pd.DataFrame({"code1": ['A', 'B', 'C', 'C','D'], 
       "code2": ["1", "0", "1", "1","1"], 
       "column1":['value1','value2','value3','value4','value5']}) 

    code1 code2 column1 
    0  A  1 value1 
    1  B  0 value2 
    2  C  1 value3 
    3  C  1 value4 
    4  D  1 value5 

df2 = pd.DataFrame({"code1": ['A','B','C'], 
       "code2": ["0", "0", "1"], 
       "column2":['valuex','valuey','valuez']}) 

    code1 code2 column2 
    0  A  0 valuex 
    1  B  0 valuey 
    2  C  1 valuez 

這是兩個數據框,我想比較。我需要做的是這樣

df1[['code1','code2']].isin(df2[['code1','code2']]) 

與得到結果的目的:

 code1 code2 column1 
    0  B  0 value2 
    1  C  1 value3 
    2  C  1 value4 

我想保留具有相同的「代碼1」和兩個DF1和DF2「代碼2」的行, df1的其他列。 你知道最好的辦法嗎?我想避免循環,我需要它是有效的。 非常感謝你提前

回答

0

您可以簡單地使用merge()方法:

In [30]: cols = ['code1','code2'] 

In [31]: pd.merge(df1, df2[cols], on=cols) 
Out[31]: 
    code1 code2 column1 
0  B  0 value2 
1  C  1 value3 
2  C  1 value4 

UPDATE:

如果我想保留在另一個數據幀刪除的情況下?

In [62]: pd.merge(df1, df2[cols], on=cols, how='left', indicator=True).query("_merge == 'left_only'") 
Out[62]: 
    code1 code2 column1  _merge 
0  A  1 value1 left_only 
4  D  1 value5 left_only 
+0

好的謝謝!如果我想保留在另一個數據框中刪除的情況呢? –

+0

@ emilio.molina,請參閱UPDATE – MaxU

+0

完美,非常感謝!所以'指標'是決定你保存哪部分數據幀的參數,不是嗎? –

0

我將索引設置爲你想要的列並進行連接:

df1=df1.set_index(['code1','code2'])  
df2=df2.set_index(['code1','code2']) 
In [90]: df1.join(df2) 
Out[90]: 
      column1 column2 
code1 code2     
A  1  value1  NaN 
B  0  value2 valuey 
C  1  value3 valuez 
     1  value4 valuez 
D  1  value5  NaN 

爲了擺脫與南:dropna

df1.join(df2) 
Out[94]: 
      column1 column2 
code1 code2     
B  0  value2 valuey 
C  1  value3 valuez 
     1  value4 valuez 

,然後你可以丟棄索引,如果你不想要它reset_index()

df1.join(df2).dropna().reset_index() 
Out[95]: 
    code1 code2 column1 column2 
0  B  0 value2 valuey 
1  C  1 value3 valuez 
2  C  1 value4 valuez 
+0

這很好。非常感謝你。但是我有兩個問題。首先,我已經提出了這個問題,但實際上我想保留其他值,即第2列中的NaN值。第二個問題是df2有很多列(63)。所以這樣做使我刪除所有添加的列,一些相當可怕.... –

+0

順便說一句,我很抱歉,但我不能添加點,直到我得到15的聲譽,所以我不能接受你的答案..我相信其他人都會這麼做,別擔心 –

+0

好的,我做到了。然而,雖然你的答案是有用的,它並沒有解決完全我的問題,我想獲得其他答案...我不知道如果其他人會關心這個問題,如果它被標記爲解決... –