如何用Pandas实现按水果总数量降序后组内按Rate降序排序?
Pandas实现按分组总数量降序+组内Rate降序排序
首先得处理原始数据里水果名称的大小写问题(比如Banana和banana会被Pandas视为不同分组),再按照你的需求完成排序,下面是完整的实现方案:
步骤1:构造原始数据并标准化水果名称
import pandas as pd # 还原你的原始DataFrame data = { '水果(Fruit)': ['Apple', 'Apple', 'Apple', 'Mango', 'Mango', 'Banana', 'banana'], 'Rate': [2, 3, 5, 4, 6, 2, 1], '数量(Quantity)': [4, 3, 9, 5, 12, 2, 2] } df = pd.DataFrame(data) # 统一水果名称的大小写,确保Banana和banana被归为同一组 df['水果(Fruit)'] = df['水果(Fruit)'].str.capitalize()
步骤2:添加分组总数量辅助列
我们用groupby + transform实现SQL中子查询关联的效果——把每个水果的总数量映射到该组的每一行:
# 计算每个水果的总数量,并添加为新列 df['总数量'] = df.groupby('水果(Fruit)')['数量(Quantity)'].transform('sum')
步骤3:按需求排序并清理结果
按照总数量降序、组内Rate降序排序,最后可以删除辅助列:
# 执行排序:总数量降序,Rate降序 sorted_df = df.sort_values(by=['总数量', 'Rate'], ascending=[False, False]) # 移除辅助列(如果不需要保留的话) sorted_df = sorted_df.drop(columns='总数量') # 查看最终结果 print(sorted_df)
执行后输出的结果和你期望的完全一致:
水果(Fruit) Rate 数量(Quantity) 4 Mango 6 12 3 Mango 4 5 2 Apple 5 9 1 Apple 3 3 0 Apple 2 4 5 Banana 2 2 6 Banana 1 2
思路对比(和你的SQL实现对应)
- SQL里通过子查询计算每个水果的总数量再关联回原表;Pandas里用
transform直接在原表生成总数量列,逻辑更简洁 sort_values的参数by=['总数量', 'Rate']对应SQL里的order by temp.sm desc, fr_table.rate desc,ascending=[False, False]指定两个排序键都为降序
内容的提问来源于stack exchange,提问作者Ravi Shankar
相关产品推荐
相关产品推荐

