多索引的数据帧重置索引计数

2024-10-04 01:28:09 发布

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

通过以键[a,b,c]作为索引连接多个数据帧来构造一个数据帧

+-------+----------+----------+
| Index | IndexPos | SomeData |
+-------+----------+----------+
| a     |        1 | some1     |
|       |        2 | some2     |
|       |        3 | some3     |
| b     |        1 | some1     |
|       |        2 | some2     |
|       |        3 | some3     |
| c     |        1 | some1     |
|       |        2 | some2     |
|       |        3 | some3     |
+-------+----------+----------+

现在我们要将其切成最后两个元素,如:

df.groupby(df.index.levels[0].name).tail(2)

在此之后,我想重新计算InExpos中的剩余元素,以获得以下结果:

+-------+----------+----------+
| Index | IndexPos | SomeData |
+-------+----------+----------+
| a     |        1 | some2     |
|       |        2 | some3     |
| b     |        1 | some2     |
|       |        2 | some3     |
| c     |        1 | some2     |
|       |        2 | some3     |
+-------+----------+----------+

有没有办法做到这一点,或者我必须在连接之前对其进行切片


Tags: 数据name元素dfindextaillevelsgroupby
1条回答
网友
1楼 · 发布于 2024-10-04 01:28:09

首先groupbylevel=0上,使用tail获取每个组的最后两行,然后在切片数据帧上使用groupby+cumcount为每个组创建一个顺序计数器,并将其设置为level=1处的新索引:

d = df.groupby(level=0).tail(2)
d = d.droplevel(1).set_index(d.groupby(level=0).cumcount().add(1), append=True)

或者使用factorize代替受@anky解决方案启发的groupby+cumcount

d = df.groupby(level=0).tail(2)
d = d.droplevel(1).set_index(d.index.get_level_values(1).factorize()[0] + 1, append=True)

结果:

print(d)

        SomeData
Index           
a     1    some2
      2    some3
b     1    some2
      2    some3
c     1    some2
      2    some3

相关问题 更多 >