2016-10-06 12 views
1

私は2つのパンダのデータフレームを持っています(下記参照)。私はid(Dataframe1)とlocalid(Dataframe2)に基づいてそれらをマージします。 このコードは機能していません。 Dataframe2は複数の同じローカライズ(例えば、D3)を含む可能性があるため、dfmergedに追加の行を作成します。最初のデータフレーム(DataFrame1)にlocalidが存在しない場合、これらの2つのデータフレームをマージし、 'color'カラムの値をNaNに設定するにはどうすればよいですか?パンダのデータフレームを2つにマージするにはどうすればいいですか?

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

enter image description here

+0

はあなたが所望の出力を追加することはできますか? – jezrael

+1

まず、df2のidを重複しないようにする必要があります。最後にマージされたdfのすべてのidをデフォルトで 'inner'にするには、 'how = 'outer''を渡す必要があります。両方に存在するIDのみがマージされます – EdChum

答えて

2

私はあなたがdf2listgroupbysum値が必要だと思うし、その後droplocalidmergeを使用する:あなたは、おそらく

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は何の繰り返しキー持たない簡素化し、その後、union of keys from both frameshow:'outer'で)使用するpd.mergeに教える:

になり
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 
関連する問題