Одна идея состоит в том, чтобы создать индекс по количеству и затем использовать его для сортировки:
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