根据其他数据框更新熊猫数据框

时间:2018-07-09 21:27:51

标签: python pandas

我有两个熊猫DataFrame:

df1

key    id    count
100    9821   7
200    9813   10

df2

nodekey    nodeid    
100        9821   
200        9813  

如果df2中的nodekey + nodeid与df1中的key + id相匹配,则df1中的count必须设置为0。因此,以上示例的结果应为;

key    id    count
100    9821   0
200    9813   0

我尝试了以下操作(仅在键和节点键上进行匹配,作为测试),但收到错误消息:

df1['count']=np.where((df1.key == df2.nodekey),0)

ValueError: either both or neither of x and y should be given

建议?

2 个答案:

答案 0 :(得分:2)

这应该有效

df1.loc[df1[['key', 'id']].transform(tuple,1).isin(df2[['nodekey', 'nodeid']].transform(tuple,1)), "count"] = 0

基本上是使用

df.loc[mask, 'count']=0 

对于元组mask与任何元组True匹配的行,('key', 'id')('nodekey', 'nodeid')

答案 1 :(得分:0)

使用左合并合并数据帧(df1中存在但df2中不存在的行将用nan s填充)

combined = df1.merge(df2, left_on=['key', 'id'],
                         right_on=['nodekey', 'nodeid'], how='left')

更新非nan行的计数:

combined.loc[combined.nodekey.notnull(), 'count'] = 0

清理不需要的列:

combined.drop(['nodekey', 'nodeid'], axis=1, inplace=True)
#   key    id  count
#0  100  9821      0
#1  200  9813      0
#2  300  9855      7