首页 文章

组内的Pandas排序会导致重复索引

提问于
浏览
3

我有一个pandas DataFrame,格式如下:

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

  • 3

    您可以按列 C1 排序,然后按级别0排序索引 . 您必须将 sort_remaining 参数指定为 False 才能使其适用于multiIndex数据框:

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

    enter image description here

  • 2

    您需要将参数 group_keys=False 添加到groupby

    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
    

相关问题