Панды объединяются в одну таблицу с несколькими столбцами, что приводит к неожиданному выводу - PullRequest
0 голосов
/ 08 марта 2019

У меня есть фрейм данных df со столбцами: [value, arg1, arg2, diff_value]. Я хочу найти все строки, где (diff_value, arg1, arg2) в df (как первые 3 столбца). Мой код для этого:

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'], где 'a' - это значение diff_value в строке 1 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 как (значение, arg1, arg2). Однако вместо этого выводится строка 1.

1 Ответ

0 голосов
/ 08 марта 2019

Проблема в том, что первые значения в слиянии 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'})

Это дает желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...