我有一个数据帧df
id value
1 100
2 200
3 500
4 600
5 700
6 800
我有另一个数据帧df2
c_id flag
2 Y
3 Y
5 Y
同样df3
c_id flag
1 N
3 Y
4 Y
我想合并这3个数据帧并在df中创建一个列 这样我的df看起来像:
id value flag
1 100 N
2 200 Y
3 500 Y
4 600 Y
5 700 Y
6 800 nan
我不想使用df2和df3连接</ p>
例如(
final = pd.concat([df2,df3],ignore_index=False)
final.drop_duplicates(inplace=True)
我不想使用这种方法,还有其他方法吗?
答案 0 :(得分:1)
在pd.merge
和df
组合
df2+df3
In [1150]: df.merge(df2.append(df3), left_on=['id'], right_on=['c_id'], how='left')
Out[1150]:
id value c_id flag
0 1 100 1.0 N
1 2 200 2.0 Y
2 3 500 3.0 Y
3 3 500 3.0 Y
4 4 600 4.0 Y
5 5 700 5.0 Y
6 6 800 NaN NaN
详细
In [1151]: df2.append(df3)
Out[1151]:
c_id flag
0 2 Y
1 3 Y
2 5 Y
0 1 N
1 3 Y
2 4 Y
答案 1 :(得分:0)
使用map
你可以
In [1140]: df.assign(flag=df.id.map(
df2.set_index('c_id')['flag'].combine_first(
df3.set_index('c_id')['flag']))
)
Out[1140]:
id value flag
0 1 100 N
1 2 200 Y
2 3 500 Y
3 4 600 Y
4 5 700 Y
5 6 800 NaN
让我解释一下,使用set_index
和combine_first
为mapping
和id
创建flag
In [1141]: mapping = df2.set_index('c_id')['flag'].combine_first(
df3.set_index('c_id')['flag'])
In [1142]: mapping
Out[1142]:
c_id
1 N
2 Y
3 Y
4 Y
5 Y
Name: flag, dtype: object
In [1143]: df.assign(flag=df.id.map(mapping))
Out[1143]:
id value flag
0 1 100 N
1 2 200 Y
2 3 500 Y
3 4 600 Y
4 5 700 Y
5 6 800 NaN
答案 2 :(得分:0)
合并df2和df3
df= pd.merge(pd.merge(df,df2,on='ID',how='left'),df3,on='ID',how='left')
填空“
df['ID'] =df['ID_y'].fillna(df['ID_x']
删除列
del df['ID_y']; del df['ID_x']
或者你可以追加,
df4 = df2.append(df3)
pd.merge(df,df4,how='left',on='ID')