Объединение двух фреймов данных по индексу
Привет у меня есть следующие таблицы данных:
> 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
это плохая практика для слияния на индекс? Это невозможно? Если да, то могу ли я переместить индекс в новый столбец под названием "Индекс"?
спасибо
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