Pandas分组排序导致索引重复

3
我有一个如下格式的pandas数据框:
           C1        C2
A 0  1.764052  0.400157
  1  0.978738  2.240893
  2  1.867558 -0.977278
  3  0.950088 -0.151357
  4 -0.103219  0.410599
C 0  0.144044  1.454274
  1  0.761038  0.121675
  2  0.443863  0.333674
  3  1.494079 -0.205158
  4  0.313068 -0.854096

它是由这段代码生成的:
import pandas as pd
import numpy as np
idx = pd.MultiIndex.from_product([['A','C'],range(5)])
np.random.seed(0)
df = pd.DataFrame(index=idx, data = np.random.randn(len(idx), 2), columns=['C1','C2'])

我想要分别按照第一索引级别中的每个组,按照列 C1 进行排序,因此我使用了 groupby 函数:

df.groupby(level=0).apply(lambda x: x.sort_values('C1'))

然后我得到了结果:
             C1        C2
A A 4 -0.103219  0.410599
    3  0.950088 -0.151357
    1  0.978738  2.240893
    0  1.764052  0.400157
    2  1.867558 -0.977278
C C 0  0.144044  1.454274
    4  0.313068 -0.854096
    2  0.443863  0.333674
    1  0.761038  0.121675
    3  1.494079 -0.205158

为什么第一级重复?在每个组内部有更好的排序数据的方法吗?
2个回答

4
您需要在groupby中添加参数group_keys=False
a = df.groupby(level=0, group_keys=False).apply(lambda x: x.sort_values('C1'))
print (a)
           C1        C2
A 4 -0.103219  0.410599
  3  0.950088 -0.151357
  1  0.978738  2.240893
  0  1.764052  0.400157
  2  1.867558 -0.977278
C 0  0.144044  1.454274
  4  0.313068 -0.854096
  2  0.443863  0.333674
  1  0.761038  0.121675
  3  1.494079 -0.205158

1
这个函数解决了我的问题,但我不太确定为什么。在某些情况下,pandas没有进行任何分组,但是在尝试更大的数据集时它做到了。无论如何,感谢您提供的解决方案! - Charles Naccio

3

您可以按列C1排序,然后按0级别对索引进行排序。您必须将sort_remaining参数指定为False,以便多级索引数据框正常工作:

df.sort_values('C1').sort_index(level = 0, sort_remaining=False)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接