如何更改熊猫数据框中多索引的外层索引?

Posted

技术标签:

【中文标题】如何更改熊猫数据框中多索引的外层索引?【英文标题】:How to change outer level index in multi index in pandas dataframe? 【发布时间】:2020-06-24 15:09:09 【问题描述】:

我有一个包含 900 万行的多级索引的数据框,如下所示。我希望将在某些情况下不唯一的 0 级索引更改为包含唯一索引的数字顺序。这是示例输入:

ORDER             NO         DATE
4200000303        1          2015-02-19
                  2          2015-02-19
                  3          2015-02-19
1200000303        1          2016-07-19
                  2          2016-07-19
                  3          2016-07-19
                  4          2016-07-19
1500000303        1          2017-08-19
                  2          2017-08-19
                  3          2017-08-19
                  4          2017-08-19
x8594345 rows

期望的输出应该是:

ORDER             NO         DATE
0                 1          2015-02-19
                  2          2015-02-19
                  3          2015-02-19
1                 1          2016-07-19
                  2          2016-07-19
                  3          2016-07-19
                  4          2016-07-19
2                 1          2017-08-19
                  2          2017-08-19
                  3          2017-08-19
                  4          2017-08-19
x8594345 rows

我试过下面的代码:

transactions.index = pd.MultiIndex.from_arrays(
    [list(range(0,transactions.shape[0])), transactions.groupby(level=0).cumcount()],
    names=['ORDER', 'NO'])

但它返回的是一个扁平的数据框。

【问题讨论】:

【参考方案1】:

仅在第一级使用factorize

transactions.index = pd.MultiIndex.from_arrays(
                              [pd.factorize(transactions.index.get_level_values(0))[0],
                               transactions.index.get_level_values(1)],
                              names=['ORDER', 'NO'])

print (transactions)
ORDER  NO
0      1     2015-02-19
       2     2015-02-19
       3     2015-02-19
1      1     2016-07-19
       2     2016-07-19
       3     2016-07-19
       4     2016-07-19
2      1     2017-08-19
       2     2017-08-19
       3     2017-08-19
       4     2017-08-19
Name: A, dtype: object

【讨论】:

非常感谢。完美的解决方案! 但是有一些非唯一索引。我相信分解方法再次复制非唯一索引。有没有办法消除这个问题? @chanakya 你觉得a = transactions.index.get_level_values(0).to_series() 然后transactions.index = pd.MultiIndex.from_arrays( [a. ne (a. shift()). cumsum() , transactions.index.get_level_values(1)], names=['ORDER', 'NO'])【参考方案2】:

可能有更好的方法,但我现在会这样做:

(df.reset_index()
  .assign(ORDER=lambda x: x['ORDER'].factorize()[0])
  .set_index(['ORDER','NO'])
)

【讨论】:

以上是关于如何更改熊猫数据框中多索引的外层索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改多索引数据框中的索引

具有可迭代对象的字典字典到具有多索引的可迭代对象索引的熊猫数据框

访问熊猫数据框中内部多索引级别的最后一个元素

如何在不合并索引的情况下连接具有不同多索引的两个数据帧?

为啥我在多索引的索引中有空项目

如何更改熊猫数据框中的单个索引值?