【问题标题】:Pandas Dataframe Multiindex Merge熊猫数据框多索引合并
【发布时间】:2019-03-18 01:01:01
【问题描述】:

我想问一个关于在 pandas 中合并多索引数据框的问题,这是一个假设场景:

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index1 = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
index2 = pd.MultiIndex.from_tuples(tuples, names=['third', 'fourth'])

s1 = pd.DataFrame(np.random.randn(8), index=index1, columns=['s1'])
s2 = pd.DataFrame(np.random.randn(8), index=index2, columns=['s2'])

然后

s1.merge(s2, how='left', left_index=True, right_index=True)

s1.merge(s2, how='left', left_on=['first', 'second'], right_on=['third', 'fourth'])

会导致错误。

我是否必须在 s1/s2 上执行 reset_index() 才能完成这项工作?

【问题讨论】:

  • 这是让许多 Pandas 新用户/编码人员感到沮丧的事情之一,有很多不同的方法可以做同样的事情。我喜欢这样,因为根据数据集或您为什么首先这样做,您可以采用易于编码和理解的路线,或者您可以优化更快的运行时间路线。

标签: python pandas merge multi-index


【解决方案1】:

似乎你需要使用它们的组合。

s1.merge(s2, left_index=True, right_on=['third', 'fourth'])
#s1.merge(s2, right_index=True, left_on=['first', 'second'])

输出:

               s1        s2
bar one  0.765385 -0.365508
    two  1.462860  0.751862
baz one  0.304163  0.761663
    two -0.816658 -1.810634
foo one  1.891434  1.450081
    two  0.571294  1.116862
qux one  1.056516 -0.052927
    two -0.574916 -1.197596

【讨论】:

    【解决方案2】:

    除了使用@ALollz 指向的索引名称,您可以简单地使用loc,它会自动匹配索引

    s1.loc[:, 's2'] = s2   # Or explicitly, s2['s2']
    
                    s1           s2
    first   second      
    bar     one     -0.111384   -2.341803
            two     -1.226569    1.308240
    baz     one      1.880835    0.697946
            two     -0.008979   -0.247896
    foo     one      0.103864   -1.039990
            two      0.836931    0.000811
    qux     one     -0.859005   -1.199615
            two     -0.321341   -1.098691
    

    一般公式是

    s1.loc[:, s2.columns] = s2
    

    【讨论】:

      【解决方案3】:

      rename_axis

      您可以重命名一级的索引级别并让join 做它的事情

      s1.join(s2.rename_axis(s1.index.names))
      
                          s1        s2
      first second                    
      bar   one    -0.696420 -1.040463
            two     0.640891  1.483262
      baz   one     1.598837  0.097424
            two     0.003994 -0.948419
      foo   one    -0.717401  1.190019
            two    -1.201237 -0.000738
      qux   one     0.559684 -0.505640
            two     1.979700  0.186013
      

      concat

      pd.concat([s1, s2], axis=1)
      
                          s1        s2
      first second                    
      bar   one    -0.696420 -1.040463
            two     0.640891  1.483262
      baz   one     1.598837  0.097424
            two     0.003994 -0.948419
      foo   one    -0.717401  1.190019
            two    -1.201237 -0.000738
      qux   one     0.559684 -0.505640
            two     1.979700  0.186013
      

      【讨论】:

        【解决方案4】:

        通过combine_first分配它

        s1.combine_first(s2)
        Out[19]: 
                            s1        s2
        first second                    
        bar   one     0.039203  0.795963
              two     0.454782 -0.222806
        baz   one     3.101120 -0.645474
              two    -1.174929 -0.875561
        foo   one    -0.887226  1.078218
              two     1.507546 -1.078564
        qux   one     0.028048  0.042462
              two     0.826544 -0.375351
        
        # s2.combine_first(s1)
        

        【讨论】:

          猜你喜欢
          • 2018-02-02
          • 2021-03-25
          • 2020-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多