熊猫排序多索引并重置

时间:2016-06-30 15:23:47

标签: python sorting pandas

我正在尝试浏览具有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

这个似乎足够简单,但我无法想出一个动态重置第二个索引级别的好方法。请帮忙。

1 个答案:

答案 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