大熊猫在同一张表中合并有多列,从而产生意外的输出

时间:2019-03-08 14:28:08

标签: python pandas join merge inner-join

我有一个数据列df,其列为:[valuearg1arg2diff_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行。

1 个答案:

答案 0 :(得分:0)

问题在于,left_onright_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'})

这将产生所需的结果。