2017-05-04 117 views
0

我試圖用幾種方式處理數據幀。 現在我想合併基於特定列信息的兩個數據幀並刪除重複的行根據特定的列信息合併兩個數據幀

是否有可能? 我試圖用串聯功能,但faliled ...

例如,如果我想合併DF1和DF2到D3與

條件:

  • 如果c1 & C2的信息是一樣的,刪除重複的行(僅使用DF1,即使DF1 DF2和C3之間的數據是不同的)
  • 如果c1 & C2信息是不同的,使用兩行(DF1,DF2)

前:

df1 
c1 c2 c3 
0 0 x {'a':1 ,'b':2} 
1 0 y {'a':3 ,'b':4} 
2 2 z {'a':5 ,'b':6} 

df2 
    c1 c2 c3 
0 0 x {'a':11 ,'b':12} 
1 0 y {'a':13 ,'b':14} 
2 3 z {'a':15 ,'b':16} 

預期的結果D3:

c1 c2 c3 
0 0 x {'a':1 ,'b':2} 
1 0 y {'a':3 ,'b':4} 
2 2 z {'a':5 ,'b':6} 
3 3 z {'a':15 ,'b':16} 

在這裏輸入的代碼

+0

如何合併功能? – TLOwater

回答

0

您可以先通過行僅在DF2使用merge確定和傳遞how='right'indicator=True做到這一點,然後concat這與df1

In [125]: 
merged = df1.merge(df2, left_on=['c1','c2'], right_on=['c1','c2'], how='right', indicator=True) 
merged = merged[merged['_merge']=='right_only'] 
merged = merged.rename(columns={'c3_y':'c3'}) 
merged 

Out[125]: 
    c1 c2 c3_x    c3  _merge 
2 3 z NaN {'a':15 ,'b':16} right_only 

In [126]:  
combined = pd.concat([df1, merged[df1.columns]]) 
combined 

Out[126]: 
    c1 c2    c3 
0 0 x {'a':1 ,'b':2} 
1 0 y {'a':3 ,'b':4} 
2 2 z {'a':5 ,'b':6} 
2 3 z {'a':15 ,'b':16} 

如果我們打破上面:

In [128]: 
merged = df1.merge(df2, left_on=['c1','c2'], right_on=['c1','c2'], how='right', indicator=True) 
merged 

Out[128]: 
    c1 c2   c3_x    c3_y  _merge 
0 0 x {'a':1 ,'b':2} {'a':11 ,'b':12}  both 
1 0 y {'a':3 ,'b':4} {'a':13 ,'b':14}  both 
2 3 z    NaN {'a':15 ,'b':16} right_only 

In [129]: 
merged = merged[merged['_merge']=='right_only'] 
merged 

Out[129]: 
    c1 c2 c3_x    c3_y  _merge 
2 3 z NaN {'a':15 ,'b':16} right_only 

In [130]: 
merged = merged.rename(columns={'c3_y':'c3'}) 
merged 

Out[130]: 
    c1 c2 c3_x    c3  _merge 
2 3 z NaN {'a':15 ,'b':16} right_only