pandas 按另一列的平均值对一列的值进行排序
Posted
技术标签:
【中文标题】pandas 按另一列的平均值对一列的值进行排序【英文标题】:pandas sort values of one column by the average of the other column 【发布时间】:2019-04-02 10:57:14 【问题描述】:假设我有以下数据框:
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,因此我想对数据帧进行排序,使 dog 排在第一位,然后是 cat,然后是 bird,像下面这样:
A B
1 dog 5
2 dog 8
3 dog 11
4 cat 3
5 cat 7
6 bird 3
7 bird 5
这样做的最佳方法是什么? 我试图将“A”列设置为索引,而不是对其进行排序,但我无法弄清楚。 任何帮助将不胜感激!
【问题讨论】:
【参考方案1】:将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
【讨论】:
以上是关于pandas 按另一列的平均值对一列的值进行排序的主要内容,如果未能解决你的问题,请参考以下文章
根据另一列中的值删除一列的重复项,Python,Pandas