我有一个dataframe df
id value
1 100
2 200
3 500
4 600
5 700
6 800
我有另一个dataframe 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串联
for eg(
final = pd.concat([df2,df3],ignore_index=False)
final.drop_duplicates(inplace=True)
我不想使用这种方法,还有其他方法吗?
使用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
使用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
为id
和flag
mapping
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
在df2和df3
上合并df= pd.merge(pd.merge(df,df2,on='ID',how='left'),df3,on='ID',how='left')
填充nulls
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')