Python Pandas-如何在具有不同级别数的索引上联接DataFrame?

时间:2018-08-10 15:15:59

标签: python pandas dataframe

假设我有以下2个数据框:

  1. df1,其索引为['NameID','Date']。例如,df1可以是公司员工历史工资的面板数据集。

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

3 个答案:

答案 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)