条件

时间:2017-09-15 09:13:20

标签: pandas

我有一个数据帧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)

我不想使用这种方法,还有其他方法吗?

3 个答案:

答案 0 :(得分:1)

pd.mergedf组合

之间使用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_indexcombine_firstmappingid创建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')