【问题标题】:Python Pandas - How do I join DataFrames on indices with different number of levels?Python Pandas - 如何在具有不同级别数的索引上加入 DataFrames?
【发布时间】:2019-01-18 05:57:32
【问题描述】:

假设我有以下 2 个 DataFrame:

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

  2. df2,其索引为 ['NameID']。例如,df2 可以是员工生日和 SSN 的数据集。

在 'NameID' 上将 df1 和 df2 作为 1:m 的索引加入的最有效方法是什么? 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

【问题讨论】:

  • 如果你创建了minimal reproducible example会更有帮助
  • 你尝试合并索引吗?例如,df3 = pd.merge(df1, df2, left_index=True, right_index=True)
  • 谢谢沃里克。我想我现在已经准备好你的答案了......我不敢相信它是如此简单。我完全被这篇文章中的最佳答案误导了,认为合并不能用于合并索引...stackoverflow.com/questions/36538780/…。请发表你的答案,我会选择它。
  • 不用担心。很高兴它有帮助!

标签: python pandas dataframe


【解决方案1】:

您可能想merge

df = pd.merge(df1, df2, on='NameID', how='left')

【讨论】:

    【解决方案2】:

    查看 Michael B 的回答,但除此之外,您可能还想排序以获得您请求的输出:

    pd.merge(df1, df2, on='NameID', how='left').sort_values('SSN', ascending=False)
    

    【讨论】:

      【解决方案3】:

      代表warwick12回答

      df3 = pd.merge(df1, df2, left_index=True, right_index=True)

      【讨论】:

        猜你喜欢
        • 2015-06-02
        • 2014-11-11
        • 2018-11-01
        • 2013-03-16
        • 1970-01-01
        • 2021-10-10
        • 1970-01-01
        • 2014-07-10
        • 2021-10-26
        相关资源
        最近更新 更多