Предположим, у меня есть 2 следующих фрейма данных:
df1, индекс которого ['NameID', 'Date']. Например, df1 может быть панельным набором данных о прошлых зарплатах сотрудников компании.
df2, индекс которого ['NameID']. Например, df2 может быть набором данных о дне рождения сотрудников и SSN.
Каков наиболее эффективный способ объединения df1 и df2 по NameID в качестве индекса на основе 1: m? DataFrame.join () не разрешает соединение 1: m. Я знаю, что могу сначала выполнить reset_index () как для df1, так и для df2, а затем использовать DataFrame.merge (), чтобы присоединить их к столбцам, но я думаю, что это неэффективно.
Код:
df1 = pd.DataFrame({'NameID':['A','B','C']*3,
'Date':['20180801']*3+['20180802']*3+['20180803']*3,
'Salary':np.random.rand(9)
})
df1 = df1.set_index(['NameID', 'Date'])
df1
NameID Date Salary
A 20180801 0.831064
B 20180801 0.419464
C 20180801 0.239779
A 20180802 0.500048
B 20180802 0.317452
C 20180802 0.188051
A 20180803 0.076196
B 20180803 0.060435
C 20180803 0.297118
df2 = pd.DataFrame({'NameID':['A','B','C'],
'SSN':[999,888,777]
})
df2 = df2.set_index(['NameID'])
df2
NameID SSN
A 999
B 888
C 777
Результат, который я хочу получить:
NameID Date Salary SSN
A 20180801 0.831064 999
A 20180802 0.500048 999
A 20180803 0.076196 999
B 20180801 0.419464 888
B 20180802 0.317452 888
B 20180803 0.060435 888
C 20180801 0.239779 777
C 20180802 0.188051 777
C 20180803 0.297118 777
Вы пробовали объединить по индексу? Пример, df3 = pd.merge (df1, df2, left_index = True, right_index = True)
Спасибо, Уорвик. Думаю, теперь я готов к твоему ответу ... Не могу поверить, что это так просто. Я был полностью введен в заблуждение верхним ответом в этом посте, и подумал, что слияние нельзя использовать для слияния индексов ... stackoverflow.com/questions/36538780/…. Отправьте свой ответ, и я выберу его.
Без проблем. Рад, что помог!
Вы можете захотеть слияние.
df = pd.merge(df1, df2, on='NameID', how='left')
См. Ответ Майкла Б, но, кроме того, вы также можете выполнить сортировку, чтобы получить запрошенный результат:
pd.merge(df1, df2, on='NameID', how='left').sort_values('SSN', ascending=False)
Отвечаем от имени warwick12
df3 = pd.merge (df1, df2, left_index = True, right_index = True)
Было бы более полезно, если бы вы создали минимальный воспроизводимый пример