例如,我的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
内,Prod
由Count
进行排序
我尝试使用df.groupby('area', 'prod').sort_values(by=('Count'), ascending=False))
无法解决它。谢谢
答案 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