Объединение двух фреймов данных по индексу



Привет у меня есть следующие таблицы данных:



> 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) использует столбцы для выполнения matching.In факт делает это я получаю:



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


это плохая практика для слияния на индекс? Это невозможно? Если да, то могу ли я переместить индекс в новый столбец под названием "Индекс"?



спасибо

886   4  

4 ответов:

использовать 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

можно использовать concat([df1, df2,...], axis=1) для объединения двух или более DFs, выровненных по индексам:

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)

если вы хотите объединить два фрейма данных в панд вы можете использовать просто атрибуты, доступные как merge или conacenate. Например, если у меня есть два фрейма данных df1 и df2 Я могу присоединиться к ним тогда:

newdataframe=merge(df1,df2,left_index=True,right_index=True)

глупая ошибка, которая меня достала: соединения не удалось, потому что индексы dtypes отличались. Это не было очевидно, поскольку обе таблицы были сводными таблицами одной и той же исходной таблицы. После reset_index, индексы выглядели идентичными в jupyter. Он только появился на свет при сохранении в excel...

исправлено с: df1[['key']] = df1[['key']].apply(pd.to_numeric)

надеюсь, это сэкономит кому-то час!

Comments

    Ничего не найдено.