В чем разница между объединить и объединить в Пандах?


предположим, что у меня есть два фрейма данных:

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 87

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():

  1. поиск по таблице: df1.join(df2) всегда присоединяется через индекс df2, а df1.merge(df2) может присоединяться к одному или нескольким столбцам df2 (по умолчанию) или с индексом df2right_index=True).
  2. поиск по левой таблице: по умолчанию, df1.join(df2) использует индекс df1 и df1.merge(df2) использует столбец(ы)df1. Это можно переопределить, указав df1.join(df2, on=key_or_keys) или df1.merge(df2, left_index=True).
  3. 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

http://pandas.pydata.org/pandas-docs/stable/merging.html#brief-primer-on-merge-methods-relational-algebra

панды предоставляет одну функцию, слияние, в качестве точки входа для всех стандартные операции соединения баз данных между объектами 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')