我有两个pandas数据框(见下文)。我想根据id(Dataframe1)和localid(Dataframe2)合并它们。 这段代码不起作用;它在dfmerged中创建了额外的行,因为Dataframe2可能包含多个相同的localid(例如,D3)。如何合并这两个数据帧并设置“颜色”的值?如果第一个数据帧(DataFrame1)中没有localid,那么列为NaN?
dfmerged = pd.merge(df1, df2, left_on='id', right_on='localid')
答案 0 :(得分:2)
我认为sum
中的list
中需要groupby
和df2
值,然后merge
列localid
使用drop
}:
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
答案 1 :(得分:0)
您应该简化df2
到没有重复密钥,然后告诉pd.merge
使用union of keys from both frames(how:'outer'
):< / p>
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