Об’єднайте два кадри даних за індексом


160

Привіт, у мене є такі фрейми даних:

> df1
  id begin conditional confidence discoveryTechnique  
0 278    56       false        0.0                  1   
1 421    18       false        0.0                  1 

> df2
   concept 
0  A  
1  B

Як злитися на індекси, щоб отримати:

  id begin conditional confidence discoveryTechnique   concept 
0 278    56       false        0.0                  1  A 
1 421    18       false        0.0                  1  B

Я запитую, тому що, наскільки я розумію, merge()тобто df1.merge(df2)використовує стовпці, щоб зробити відповідність. Насправді, роблячи це, я отримую:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__
    self._validate_specification()
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification
    raise MergeError('No common columns to perform merge on')
pandas.tools.merge.MergeError: No common columns to perform merge on

Чи погана практика злиття за індексом? Це неможливо? Якщо так, то як я можу перенести індекс у новий стовпець під назвою "індекс"?

Дякую


3
спробуйте це:df1.join(df2)
MaxU

Що робити, якщо ви хочете приєднатись до індексу одного фрейму даних та стовпця другого фрейму даних. (У моєму другому фреймі даних є стовпець, який відповідає індексам у першому df.)
mikey

Відповіді:


321

Використання merge, яке за замовчуванням є внутрішнім з'єднанням:

pd.merge(df1, df2, left_index=True, right_index=True)

Або join, який за замовчуванням залишено приєднатись:

df1.join(df2)

Або concat, що за замовчуванням є зовнішнім з'єднанням:

pd.concat([df1, df2], axis=1)

Зразки :

df1 = pd.DataFrame({'a':range(6),
                    'b':[5,3,6,9,2,4]}, index=list('abcdef'))

print (df1)
   a  b
a  0  5
b  1  3
c  2  6
d  3  9
e  4  2
f  5  4

df2 = pd.DataFrame({'c':range(4),
                    'd':[10,20,30, 40]}, index=list('abhi'))

print (df2)
   c   d
a  0  10
b  1  20
h  2  30
i  3  40

#default inner join
df3 = pd.merge(df1, df2, left_index=True, right_index=True)
print (df3)
   a  b  c   d
a  0  5  0  10
b  1  3  1  20

#default left join
df4 = df1.join(df2)
print (df4)
   a  b    c     d
a  0  5  0.0  10.0
b  1  3  1.0  20.0
c  2  6  NaN   NaN
d  3  9  NaN   NaN
e  4  2  NaN   NaN
f  5  4  NaN   NaN

#default outer join
df5 = pd.concat([df1, df2], axis=1)
print (df5)
     a    b    c     d
a  0.0  5.0  0.0  10.0
b  1.0  3.0  1.0  20.0
c  2.0  6.0  NaN   NaN
d  3.0  9.0  NaN   NaN
e  4.0  2.0  NaN   NaN
f  5.0  4.0  NaN   NaN
h  NaN  NaN  2.0  30.0
i  NaN  NaN  3.0  40.0

2
приємно. для інших, хто читає це, якщо це не працює, подивіться, чи потрібно .transpose()одному з ваших dfs синхронізувати індекси - це було моєю проблемою
Jona

2
Дуже дякую. Чудова відповідь. Але чому concatтреба ставити ДФ в дужках, joinі mergeнемає?
Боуен Лю

@Bowen Liu На мій погляд для можливих коротких кількох DataFrames у списку, як, dfs = [df1, df2, df3,... dfn]а потімdf = pd. concat(dfs)
jezrael

@jezrael Чи не могли б ви , будь ласка , перевірте мій новий питання в stackoverflow.com/questions/57133848 / ...
Msquare

29

ви можете використовувати concat ([df1, df2, ...], ось = 1) для об'єднання двох або більше DF, вирівняних за індексами:

pd.concat([df1, df2, df3, ...], axis=1)

або об'єднати для об'єднання за допомогою спеціальних полів / індексів:

# join by _common_ columns: `col1`, `col3`
pd.merge(df1, df2, on=['col1','col3'])

# join by: `df1.col1 == df2.index`
pd.merge(df1, df2, left_on='col1' right_index=True)

або приєднайтесь, щоб приєднатися за індексом:

 df1.join(df2)

6

За замовчуванням:
joinє стовпчик зліва
pd.mergeв стовпчику - це внутрішній приєднання до стовпця
pd.concat- це зовнішнє з'єднання в рядку

pd.concat:
приймає Ітерабельні аргументи. Таким чином, він не може приймати DataFrames безпосередньо (використовувати[df,df2] )
Розміри DataFrame повинні збігатися по осі

Joinі pd.merge:
може приймати аргументи DataFrame


5

Дурний помилок, який отримав мене: приєднання не вдалося, тому що індекс dtypesвідрізнявся. Це не було очевидно, оскільки обидві таблиці були зведеними таблицями однієї оригінальної таблиці. Післяreset_index цього індекси виглядали однаково в Юпітера. Це з’явилося лише при збереженні в Excel ...

Виправлено за допомогою: df1[['key']] = df1[['key']].apply(pd.to_numeric)

Сподіваємось, це економить когось годину!


4

Якщо ви хочете приєднати два фрейми даних у пандах, ви можете просто використовувати доступні атрибути, наприклад, mergeабо concatenate. Наприклад, якщо у мене є два фрейми даних, df1і df2я можу приєднатись до них:

newdataframe=merge(df1,df2,left_index=True,right_index=True)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.