如何使用多索引将索引重置为整数值?

2024-09-28 22:42:57 发布

您现在位置:Python中文网/ 问答频道 /正文

在处理单索引数据帧时,我倾向于使用reset_index()将索引切换回整数值

然而,有了多重索引,这一水平正在完全下降。重置为整数值无效

import pandas as pd
from random import seed, randint
from collections import OrderedDict

p1h = pd.period_range(start='2020-02-01 00:00', end='2020-02-02 00:00', freq='1h', name='p1h')
seed(1)
values1 = [randint(0,10) for p in p1h]
seed(2)
values2 = [randint(0,10) for p in p1h]

df1 = pd.DataFrame({'Values1' : values1, 'Values2' : values2}, index=p1h)

df2 = df1.stack()

结果:

df2.head(6)

p1h                      
2020-02-01 00:00  Values1    2
                  Values2    0
2020-02-01 01:00  Values1    9
                  Values2    1
2020-02-01 02:00  Values1    1
                  Values2    1

df2.reset_index(level=1, drop=True).head(6)

p1h
2020-02-01 00:00    2
2020-02-01 00:00    0
2020-02-01 01:00    9
2020-02-01 01:00    1
2020-02-01 02:00    1
2020-02-01 02:00    1

我所寻找的是在索引级别0定义的每个新组中,使整数值重新启动为0

                     Values   
Timestamp                      
2020-02-01 00:00  0       2
                  1       0
2020-02-01 01:00  0       9
                  1       1
2020-02-01 02:00  0       1
                  1       1   

拜托,有人知道吗?谢谢你的帮助!最好的


Tags: infromimportforindex整数seedpd
1条回答
网友
1楼 · 发布于 2024-09-28 22:42:57

我认为这里最简单的是通过range设置列名,所以如果使用stackget counter:

df1 = pd.DataFrame({'Values1' : values1, 'Values2' : values2}, index=p1h)

df1.columns = range(len(df1.columns))
df2 = df1.stack()
print (df2.head(6))
p1h                
2020-02-01 00:00  0    2
                  1    0
2020-02-01 01:00  0    9
                  1    1
2020-02-01 02:00  0    1
                  1    1
dtype: int64

如果使用MultiIndex,一个想法是使用rename

d = {'Values1':0, 'Values2':1}
df2 = df1.stack().rename(d, level=1)
print (df2.head(6))
p1h                
2020-02-01 00:00  0    2
                  1    0
2020-02-01 01:00  0    9
                  1    1
2020-02-01 02:00  0    1
                  1    1
dtype: int64

或通过^{}分配计数器:

df2 = (df2.reset_index(level=1, drop=True)
          .to_frame()
          .set_index(df2.groupby(level=0).cumcount(), append=True)[0])

print (df2.head(6))
p1h                
2020-02-01 00:00  0    2
                  1    0
2020-02-01 01:00  0    9
                  1    1
2020-02-01 02:00  0    1
                  1    1
Name: 0, dtype: int64

相关问题 更多 >