我正在尝试浏览具有2个索引级别的数据帧。 我以前从数据框中删除了条目,因此通常第二级不是提升。但我希望它是。 将第二级索引重置为排序列表的好方法是什么?
e.g。
a = [{'A':1, 'B':2, 'C':3, 'D':4}]
b = [{'A':1, 'B':2, 'C':3, 'D':4},
{'A':1, 'B':2, 'C':3, 'D':5},
{'A':1, 'B':2, 'C':3, 'D':4}]
c = [{'A':1, 'B':2, 'C':3, 'D':4}]
df = pd.concat({10:pd.DataFrame(a), 20:pd.DataFrame(b), 30:pd.DataFrame(c)})
df.index.names = ['foo', 'bar']
所以df看起来像这样:
A B C D
foo bar
10 0 1 2 3 4
20 0 1 2 3 4
1 1 2 3 5
2 1 2 3 4
30 0 1 2 3 4
现在,如果我碰巧删除所有条目,其中列'D'> = 4:
df[df['D']<=4]
我们得到这样的东西:
A B C D
foo bar
10 0 1 2 3 4
20 0 1 2 3 4
2 1 2 3 4
30 0 1 2 3 4
我现在想为每个'foo'索引重新分配一个排序的'bar'索引。 它应该是这样的:
A B C D
foo bar
10 0 1 2 3 4
20 0 1 2 3 4
1 1 2 3 4
30 0 1 2 3 4
这个似乎足够简单,但我无法想出一个动态重置第二个索引级别的好方法。请帮忙。
答案 0 :(得分:1)
cumcount
的一种可能解决方案:
df = df[df['D']<=4]
df.reset_index('bar', drop=True, inplace=True)
df['bar'] = df.groupby(level='foo').cumcount()
df.set_index('bar', inplace=True, append=True)
print (df)
A B C D
foo bar
10 0 1 2 3 4
20 0 1 2 3 4
1 1 2 3 4
30 0 1 2 3 4