我有一个具有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'])
但是它返回的是扁平化的数据帧。
答案 0 :(得分: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
答案 1 :(得分:0)
也许有更好的方法,但是我现在就去做:
(df.reset_index()
.assign(ORDER=lambda x: x['ORDER'].factorize()[0])
.set_index(['ORDER','NO'])
)