假设我具有以下数据框:
A B
1 cat 3
2 cat 7
3 dog 5
4 dog 8
5 dog 11
6 bird 3
7 bird 5
'cat'的平均值为5,'dog'的平均值为8,'bird'的平均值为4,因此我想对数据框进行排序,以使狗比猫和鸟更优先。类似于以下内容:
A B
1 dog 5
2 dog 8
3 dog 11
4 cat 3
5 cat 7
6 bird 3
7 bird 5
什么是最好的方法? 我试图将“ A”列设置为索引,而不是对其进行排序,但我无法弄清楚。 任何帮助将不胜感激!
答案 0 :(得分:2)
将GroupBy.transform
与mean
一起用于一系列与原始DataFrame大小相同的聚合值,然后使用argsort in descending order
进行排名,并按DataFrame.iloc
重新排序:
df = df.iloc[(-df.groupby('A')['B'].transform('mean')).argsort()]
print (df)
A B
3 dog 5
4 dog 8
5 dog 11
1 cat 3
2 cat 7
6 bird 3
7 bird 5
或将汇总值转换为有序的Categorical
,然后转换为sort_values
:
a = df.groupby('A')['B'].mean().sort_values(ascending=False)
df['A'] = pd.Categorical(df['A'], ordered=True, categories=a.index)
df = df.sort_values('A')
print (df)
A B
3 dog 5
4 dog 8
5 dog 11
1 cat 3
2 cat 7
6 bird 3
7 bird 5