熊猫排序但保持分组

时间:2020-04-20 06:35:31

标签: python pandas numpy dataframe

例如,我的df包含以下列:

Area     Prod     Count
  A           A1          5
  A           A2          4
  B           B1          5
  B           B2         11
  B           B3         15
  C           C1          5 

我想基于出现次数应用排序,然后按Count排序 例如,对df进行排序后,应如下所示:

Area     Prod     Count
  B           B3         15
  B           B2         11
  B           B1          1
  A           A1          5
  A           A2          4
  C           C1          5 

由于B具有3行,因此首先对其进行排序,然后在B内,ProdCount进行排序 我尝试使用df.groupby('area', 'prod').sort_values(by=('Count'), ascending=False))无法解决它。谢谢

1 个答案:

答案 0 :(得分:1)

一个想法是按计数创建索引,然后将其用于排序:

df.index = df['Area'].map(df['Area'].value_counts()).rename('idx')

print (df.sort_values(['idx','Count'], ascending=False))
    Area Prod  Count
idx                 
3      B   B3     15
3      B   B2     11
3      B   B1      5
2      A   A1      5
2      A   A2      4
1      C   C1      5

df = df.sort_values(['idx','Count'], ascending=False).reset_index(drop=True)
print (df)
  Area Prod  Count
0    B   B3     15
1    B   B2     11
2    B   B1      5
3    A   A1      5
4    A   A2      4
5    C   C1      5

但是问题应该是,如果有多个相同的计数,则将D组添加为长度3

print (df)
  Area Prod  Count
0    A   A1      5
1    A   A2      4
2    B   B1      5
3    B   B2     11
4    B   B3     15
5    C   C1      5
6    D   A1     50
7    D   A2     40
8    D   B1      5

然后通过计数创建索引:

df.index = df['Area'].map(df['Area'].value_counts()).rename('idx')
print (df)
    Area Prod  Count
idx                 
2      A   A1      5
2      A   A2      4
3      B   B1      5
3      B   B2     11
3      B   B3     15
1      C   C1      5
3      D   A1     50
3      D   A2     40
3      D   B1      5

但是如果像第一个解决方案那样排序是混合行:

print (df.sort_values(['idx','Count'], ascending=False))
    Area Prod  Count
idx                 
3      D   A1     50
3      D   A2     40
3      B   B3     15
3      B   B2     11
3      B   B1      5
3      D   B1      5
2      A   A1      5
2      A   A2      4
1      C   C1      5

解决方案是添加列Area进行排序,例如全部降序:

print (df.sort_values(['idx','Area','Count'], ascending=False))
    Area Prod  Count
idx                 
3      D   A1     50
3      D   A2     40
3      D   B1      5
3      B   B3     15
3      B   B2     11
3      B   B1      5
2      A   A1      5
2      A   A2      4
1      C   C1      5

或者您可以通过升序对Area进行排序:

print (df.sort_values(['idx','Area','Count'], ascending=[False, True, False]))
    Area Prod  Count
idx                 
3      B   B3     15
3      B   B2     11
3      B   B1      5
3      D   A1     50
3      D   A2     40
3      D   B1      5
2      A   A1      5
2      A   A2      4
1      C   C1      5