【问题标题】:How to merge two dataframes with MultiIndex?如何使用 MultiIndex 合并两个数据框?
【发布时间】:2017-05-14 12:07:34
【问题描述】:

我有一个框架看起来像:

            2015-12-30  2015-12-31
300100  am    1             3
        pm    3             2
300200  am    5             1
        pm    4             5
300300  am    2             6
        pm    3             7

另一个框架看起来像

            2016-1-1    2016-1-2    2016-1-3    2016-1-4
300100  am    1           3            5           1
        pm    3           2            4           5
300200  am    2           5            2           6
        pm    5           1            3           7
300300  am    1           6            3           2
        pm    3           7            2           3
300400  am    3           1            1           3
        pm    2           5            5           2
300500  am    1           6            6           1
        pm    5           7            7           5

现在我想合并两个帧,合并后的帧是这样的:

             2015-12-30 2015-12-31  2016-1-1    2016-1-2    2016-1-3    2016-1-4
  300100  am    1          3           1           3           5           1
          pm    3          2           3           2           4           5
  300200  am    5          1           2           5           2           6
          pm    4          5           5           1           3           7
  300300  am    2          6           1           6           3           2
          pm    3          7           3           7           2           3
  300400  am                           3           1           1           3
          pm                           2           5           5           2
  300500  am                           1           6           6           1
          pm                           5           7           7           5

我尝试了 pd.merge(frame1,frame2,right_index=True,left_index=True),但它返回的不是所需的格式。任何人都可以帮忙吗?谢谢!

【问题讨论】:

  • frame1.indexframe2.index 是什么?输出有什么问题?
  • frame1.index 是 MultiIndex(levels=[[300100.0, 300200.0, 300300.0], ['am', 'pm']], labels=[[0, -1, 1, -1, 2, -1], [0, 1, 0, 1, 0, 1]])
  • frame2.index 是 MultiIndex(levels=[[300100.0, 300200.0, 300300.0, 300400.0, 300500.0], ['am', 'pm']], labels=[[0, -1, 1 , -1, 2, -1, 3, -1, 4, -1], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]])。部分输出看起来像 2016-02-01 00:00:00_x 2016-02-02 00:00:00_x \ 300100.0 am 1 3 300200.0 am 5 1 300300.0 am 2 6
  • 谢谢。但我认为更好的是如果您将图片更改为文本(因为不可能复制您的示例数据)并将有问题的输出添加到问题文本中,因为 cmets 中的格式有问题。
  • 一个想法 - pd.concat([frame1, frame2], axis=1)pd.concat([frame1, frame2], axis=1, join='inner') 是如何工作的?

标签: python-3.x pandas dataframe concat multi-index


【解决方案1】:

你可以使用join

frame1.join(frame2, how='outer')

【讨论】:

    【解决方案2】:

    你可以使用concat:

    print (pd.concat([frame1, frame2], axis=1))
               2015-12-30  2015-12-31  1.1.2016  2.1.2016  3.1.2016  4.1.2016
    300100 am         1.0         3.0         1         3         5         1
           pm         3.0         2.0         3         2         4         5
    300200 am         5.0         1.0         2         5         2         6
           pm         4.0         5.0         5         1         3         7
    300300 am         2.0         6.0         1         6         3         2
           pm         3.0         7.0         3         7         2         3
    300400 am         NaN         NaN         3         1         1         3
           pm         NaN         NaN         2         5         5         2
    300500 am         NaN         NaN         1         6         6         1
           pm         NaN         NaN         5         7         7         5
    

    第一列和第二列中的值被转换为float,因为NaN 值将int 转换为float - 请参阅docs

    一种可能的解决方案是将NaN 替换为int,例如0 再转成int:

    print (pd.concat([frame1, frame2], axis=1)
             .fillna(0)
             .astype(int))
               2015-12-30  2015-12-31  1.1.2016  2.1.2016  3.1.2016  4.1.2016
    300100 am           1           3         1         3         5         1
           pm           3           2         3         2         4         5
    300200 am           5           1         2         5         2         6
           pm           4           5         5         1         3         7
    300300 am           2           6         1         6         3         2
           pm           3           7         3         7         2         3
    300400 am           0           0         3         1         1         3
           pm           0           0         2         5         5         2
    300500 am           0           0         1         6         6         1
           pm           0           0         5         7         7         5
    

    【讨论】:

      猜你喜欢
      • 2019-08-30
      • 2019-10-01
      • 2021-04-14
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      相关资源
      最近更新 更多