Предположим, у меня есть два DataFrames, например, так:
left = pd.DataFrame({'key1': ['foo', 'bar'], 'lval': [1, 2]})
right = pd.DataFrame({'key2': ['foo', 'bar'], 'rval': [4, 5]})
Я хочу объединить их, поэтому я пытаюсь что-то вроде этого:
pd.merge(left, right, left_on='key1', right_on='key2')
И я счастлив
key1 lval key2 rval
0 foo 1 foo 4
1 bar 2 bar 5
Но я пытаюсь использовать метод соединения, который, как мне показалось, довольно похож.
left.join(right, on=['key1', 'key2'])
И я получаю это:
//anaconda/lib/python2.7/site-packages/pandas/tools/merge.pyc in _validate_specification(self)
406 if self.right_index:
407 if not ((len(self.left_on) == self.right.index.nlevels)):
--> 408 raise AssertionError()
409 self.right_on = [None] * n
410 elif self.right_on is not None:
AssertionError:
Чего мне не хватает?
merge
соединяет столбцыleft
с столбцамиright
, что вам нужно, ноjoin(... on=[...])
объединяет столбцыleft
с индексными ключамиright
, а это не то, что вам нужно. Смотрите мой ответ ниже для более подробной информации.on
опцией)other
с индексами. Помните, индексы для объединения. В то время как merge () является более общим методом.Ответы:
Я всегда использую
join
по индексам:Такую же функциональность можно получить, используя
merge
следующие столбцы:источник
right
той же глубине, что и длина наon
. Это имеет смысл для меня вроде. Я могу принять, что семантика различна. Но я хотел бы знать, смогу ли я вести себя так же с df.joinpandas.merge()
является базовой функцией, используемой для всех действий слияния / объединения.DataFrames обеспечивают
pandas.DataFrame.merge()
иpandas.DataFrame.join()
методы как удобный способ получить доступ к возможностямpandas.merge()
. Например,df1.merge(right=df2, ...)
эквивалентноpandas.merge(left=df1, right=df2, ...)
.Это основные различия между
df.join()
иdf.merge()
:df1.join(df2)
всегда присоединяется через индексdf2
, ноdf1.merge(df2)
может присоединяться к одному или нескольким столбцамdf2
(по умолчанию) или к индексуdf2
(сright_index=True
).df1.join(df2)
используется индексdf1
иdf1.merge(df2)
столбцы столбцаdf1
. Это можно изменить, указавdf1.join(df2, on=key_or_keys)
илиdf1.merge(df2, left_index=True)
.df1.join(df2)
выполняет левое соединение по умолчанию (сохраняет все строкиdf1
), ноdf.merge
выполняет внутреннее соединение по умолчанию (возвращает только совпадающие строкиdf1
иdf2
).Итак, общий подход заключается в использовании
pandas.merge(df1, df2)
илиdf1.merge(df2)
. Но для ряда распространенных ситуаций (сохранение всех строкdf1
и присоединение к индексуdf2
) вы можете сохранить некоторую типизацию, используяdf1.join(df2)
вместо этого.Некоторые примечания по этим вопросам из документации по адресу http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging :
...
источник
on=key_or_keys
чтобы изменить способ нахождения строк в правой таблице. Однако на самом деле это не так.on
Аргумент изменяет поиск на левую таблицу (df1
) от индекса к колонку (с). Однако даже с этим аргументом правильная таблица (df2
) будет сопоставлена по индексу. (См. Последний пример выше.)Я считаю, что
join()
это просто удобный метод. Попробуйтеdf1.merge(df2)
вместо этого, что позволяет указатьleft_on
иright_on
:источник
Из этой документации
И :
источник
Одно из различий заключается в том, что
merge
создается новый индекс иjoin
сохраняется индекс левой стороны. Это может иметь большое значение для ваших последующих преобразований, если вы ошибочно предполагаете, что ваш индекс не был измененmerge
.Например:
-
-
-
источник
on
параметр имеет разное значение в обоих случаяхисточник
Чтобы выразить это аналогично SQL "слияние панд означает внешнее / внутреннее соединение, а соединение панд - естественное соединение". Следовательно, когда вы используете слияние в pandas, вы хотите указать, какой тип sqlish объединения вы хотите использовать, тогда как когда вы используете pandas join, вы действительно хотите иметь соответствующую метку столбца, чтобы обеспечить ее объединение.
источник