假设我有以下2个数据框:
df1,其索引为['NameID','Date']。例如,df1可以是公司员工历史工资的面板数据集。
df2,其索引为['NameID']。例如,df2可以是员工生日和SSN的数据集。
在“ NameID”上以1:m为基础将df1和df2联接为索引的最有效方法是什么? DataFrame.join()不允许1:m连接。我知道我可以先对df1和df2进行reset_index(),然后使用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
答案 0 :(得分:2)
您可能想merge。
df = pd.merge(df1, df2, on='NameID', how='left')
答案 1 :(得分:0)
请参阅Michael B的答案,但除此之外,您可能还希望进行排序以获得所需的输出:
pd.merge(df1, df2, on='NameID', how='left').sort_values('SSN', ascending=False)
答案 2 :(得分:0)
代表warwick12回答
df3 = pd.merge(df1,df2,left_index = True,right_index = True)