我有两个熊猫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
建议?
答案 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