2016-10-06 143 views
1

我有兩個熊貓數據框(見下文)。我想根據id(Dataframe1)和localid(Dataframe2)合併它們。 此代碼無法使用;它會在dfmerged中創建額外的行,因爲Dataframe2可能包含多個相同的localid(例如D3)。我該如何合併這兩個數據框,並且如果localid不存在於第一個數據框(DataFrame1)中,則將'color'列的值設置爲NaN?如何合併爲兩個熊貓數據框?

dfmerged = pd.merge(df1, df2, left_on='id', right_on='localid') 

enter image description here

+0

您可以添加所需的輸出? – jezrael

+1

您首先需要通過將顏色組合到一個列表中來去除df2中的id,其次,如果您希望默認情況下最終合併的df中的所有id都需要傳遞'how ='outer' '所以只有在兩者中存在的id將被合併 – EdChum

回答

2

我認爲你需要在df2listgroupbysum值,然後使用mergedroplocalid

df1 = pd.DataFrame({'id':['D1','D2','D3','D4','D5','D6'], 
        'Field1':[12,15,11,7,55,8.8]}) 

print (df1) 
    Field1 id 
0 12.0 D1 
1 15.0 D2 
2 11.0 D3 
3  7.0 D4 
4 55.0 D5 
5  8.8 D6 

df2 = pd.DataFrame({'localid':['D1','D2','D3','D3','D9'], 
        'color':[['b'],['a'],['a','b'],['s','d'], ['a']]}) 

print (df2) 
    color localid 
0  [b]  D1 
1  [a]  D2 
2 [a, b]  D3 
3 [s, d]  D3 
4  [a]  D9 
df2 = df2.groupby('localid', as_index=False)['color'].sum() 
print (df2) 
    localid   color 
0  D1   [b] 
1  D2   [a] 
2  D3 [a, b, s, d] 
3  D9   [a] 


dfmerged = pd.merge(df1, 
        df2, 
        left_on='id', 
        right_on='localid', 
        how='left') 
      .drop('localid', axis=1) 

print (dfmerged) 
    Field1 id   color 
0 12.0 D1   [b] 
1 15.0 D2   [a] 
2 11.0 D3 [a, b, s, d] 
3  7.0 D4   NaN 
4 55.0 D5   NaN 
5  8.8 D6   NaN 
+0

D3的顏色值應該是[a,b,s,d]。 – kitchenprinzessin

+0

你是對的;) – jezrael

+0

我正要添加groupby語句,你很快!謝謝:) – kitchenprinzessin

0

你應該簡化df2沒有重複鍵,然後告訴pd.merge使用union of keys from both frames(與how:'outer'):

import pandas as pd 
df1 = pd.DataFrame({ 'id':['D1','D2','D3','D4','D5','D6'], 
        'Field1':[ 12, 15, 11, 7, 55, 8.8]}) 
df2 = pd.DataFrame({'localid':['D1','D2','D3','D3','D9'], 
         'color':[['blue','grey'], 
           ['yellow'], 
           ['black','red','green'], 
           ['white'], 
           ['blue']]}) 
dfmerged = pd.merge(df1, df2, left_on='id', right_on='localid') 
dfmerged2 = pd.merge(df1, df2, left_on='id', right_on='localid', how='outer') 

導致:

>>> dfmerged2 
    Field1 id    color localid 
0 12.0 D1   [blue, grey]  D1 
1 15.0 D2    [yellow]  D2 
2 11.0 D3 [black, red, green]  D3 
3 11.0 D3    [white]  D3 
4  7.0 D4     NaN  NaN 
5 55.0 D5     NaN  NaN 
6  8.8 D6     NaN  NaN 
7  NaN NaN    [blue]  D9