В чем разница между объединить и объединить в Пандах?
предположим, что у меня есть два фрейма данных:
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
но я пытаюсь использовать метод join, который, как мне кажется, очень похож.
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:
что я упустил?
4 ответа:
Я всегда использую
join
по индексам:import pandas as pd left = pd.DataFrame({'key': ['foo', 'bar'], 'val': [1, 2]}).set_index('key') right = pd.DataFrame({'key': ['foo', 'bar'], 'val': [4, 5]}).set_index('key') left.join(right, lsuffix='_l', rsuffix='_r') val_l val_r key foo 1 4 bar 2 5
такую же функциональность можно получить, используя
merge
на столбцы следующим образом:left = pd.DataFrame({'key': ['foo', 'bar'], 'val': [1, 2]}) right = pd.DataFrame({'key': ['foo', 'bar'], 'val': [4, 5]}) left.merge(right, on=('key'), suffixes=('_l', '_r')) key val_l val_r 0 foo 1 4 1 bar 2 5
pandas.merge()
является базовой функцией, используемой для всех операций слияния / соединения.таблицы данных обеспечивают
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)
.- left vs inner join:
df1.join(df2)
делает левое соединение по умолчанию (сохраняет все строкиdf1
), ноdf.merge
делает внутреннее соединение по умолчанию (возвращает только совпадающие строкиdf1
иdf2
).Итак, общий подход заключается в использовании
pandas.merge(df1, df2)
илиdf1.merge(df2)
. Но для ряда распространенных ситуаций (сохраняя все строкиdf1
и присоединение к индексу вdf2
), вы можете сохранить некоторые набрав с помощью .некоторые замечания по этим вопросам из документации по адресу http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging:
merge
- это функция в пространстве имен pandas, и это также доступен в качестве метода экземпляра класса DataFrame, с вызывающим таблицы данных неявно рассматривается левый объект в соединении.соответствующей
DataFrame.join
метод, использующийmerge
внутренне для индекс-на-индекс и индекс-на-столбец(ы) присоединяются, но присоединяются к индексам путем по умолчанию вместо того, чтобы пытаться присоединиться к общим столбцам (по умолчанию поведение дляmerge
). Если вы присоединяетесь к индексу, вы можете захотеть используйтеDataFrame.join
to сэкономить немного текста....
эти два вызова функций полностью эквивалентны:
left.join(right, on=key_or_keys) pd.merge(left, right, left_on=key_or_keys, right_index=True, how='left', sort=False)
Я считаю, что
join()
это просто удобный метод. Попробуйdf1.merge(df2)
вместо этого, что позволяет указатьleft_on
иright_on
:In [30]: left.merge(right, left_on="key1", right_on="key2") Out[30]: key1 lval key2 rval 0 foo 1 foo 4 1 bar 2 bar 5
панды предоставляет одну функцию, слияние, в качестве точки входа для всех стандартные операции соединения баз данных между объектами DataFrame:
merge(left, right, how= 'inner', on=None, left_on=None, right_on=None, left_index=false, то right_index=false, то сортировка=истина, суффиксы=('_x', '_y'), copy=True, индикатор=ложь)
и :
таблицы данных.join-это удобный способ объединения столбцов из двух потенциально по-разному индексированные фреймы данных в один результат Фрейм данных. Вот очень простой пример: выравнивание данных здесь индексы (метки строк). Такое же поведение может быть достигнуто с помощью слияние плюс дополнительные аргументы, указывающие на использование индексов: результат = ПД.слияния(влево, вправо, left_index=правда, right_index=истина, how= 'outer')