Python Pandas - как присоединиться к DataFrames по индексам с разным количеством уровней?

Предположим, у меня есть 2 следующих фрейма данных:

  1. df1, индекс которого ['NameID', 'Date']. Например, df1 может быть панельным набором данных о прошлых зарплатах сотрудников компании.

  2. 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

Было бы более полезно, если бы вы создали минимальный воспроизводимый пример

user3483203 10.08.2018 17:22

Вы пробовали объединить по индексу? Пример, df3 = pd.merge (df1, df2, left_index = True, right_index = True)

warwick12 10.08.2018 17:38

Спасибо, Уорвик. Думаю, теперь я готов к твоему ответу ... Не могу поверить, что это так просто. Я был полностью введен в заблуждение верхним ответом в этом посте, и подумал, что слияние нельзя использовать для слияния индексов ... stackoverflow.com/questions/36538780/…. Отправьте свой ответ, и я выберу его.

GoCurry 10.08.2018 17:42

Без проблем. Рад, что помог!

warwick12 10.08.2018 17:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
86
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете захотеть слияние.

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)

Другие вопросы по теме