我有一个数据列df
,其列为:[value
,arg1
,arg2
,diff_value
]。我想查找df
(作为前三列)中的(diff_value,arg1,arg2)所有行。我要做的代码是:
contains_df = df.merge(df,
left_on=['value', 'arg1', 'arg2'],
right_on=['diff_value', 'arg1', 'arg2'])\
.drop(columns=['value_y', 'diff_value_y'])\
.rename(columns={'value_x':'value', 'diff_value_x':'diff_value'})
然后,我假设df[df.value == 'a']
的第1行中的'a'
是diff_value
的值,其中contains_df
将产生至少一行。但是,我没有任何行,这意味着我的合并未达到我的预期。我该如何解决?
例如,使用:
df = pd.DataFrame({'value':['a', 'b', 'c', 'd'], 'arg1': [1, 1, 0, 0],
'arg2':[0, 0, 1, 1], 'diff_value':['z', 'a', 'b', 'y']})
我希望结果为第2行:[value:'b', arg1:1, arg2:1, diff_value:'a']
为('a'
,1,0)在第1行为(value,arg1,arg2)。但是,输出是第1行。
答案 0 :(得分:0)
问题在于,left_on
和right_on
合并中的第一个值需要交换。
contains_df = df.merge(df,
left_on=['diff_valuevalue', 'arg1', 'arg2'],
right_on=['value', 'arg1', 'arg2'])\
.drop(columns=['value_y', 'diff_value_y'])\
.rename(columns={'value_x':'value', 'diff_value_x':'diff_value'})
这将产生所需的结果。