Pandas: объединить (объединить) два кадра данных на несколько столбцов
Я пытаюсь присоединиться к двум фреймам данных pandas, используя два столбца:
new_df = pd.merge(A_df, B_df, how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')
но получил следующую ошибку:
pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4164)()
pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4028)()
pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13166)()
pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13120)()
KeyError: '[B_1, c2]'
Любая идея, какой должен быть правильный способ сделать это? Спасибо!
Ответы
Ответ 1
Попробуйте это
new_df = pd.merge(A_df, B_df, how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])
http://pandas.pydata.org/pandas-docs/version/0.19.1/generated/pandas.DataFrame.merge.html
left_on: ярлык или список, или имена полей, похожие на массив, для объединения влево DataFrame. Может быть вектором или списком векторов длины DataFrame использовать конкретный вектор в качестве ключа соединения вместо столбцы
right_on: ярлык или список или имена полей, похожие на массив, для объединения в правом DataFrame или вектор/список векторов в left_on docs
Ответ 2
проблема здесь в том, что, используя апострофы, вы устанавливаете передаваемое значение как строку, тогда как на самом деле, как сказано в документации @Shijo, функция ожидает метку или список, но не строку! Если список содержит каждое имя существа столбцов, переданное как для левого, так и для правого кадра данных, то каждое имя столбца должно быть отдельно в апострофах. Из сказанного можно понять, почему это не так:
new_df = pd.merge(A_df, B_df, how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')
И это правильный способ использования функции:
new_df = pd.merge(A_df, B_df, how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])
Ответ 3
Еще один способ сделать это:
new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')