如何在Pandas中按类别优先级筛选后对列求和(无需拆分DataFrame)
解决方案
可以直接用Pandas的分组排序+聚合逻辑实现,无需拆分DataFrame,核心思路是按地区分组后,根据flag优先级筛选出每个地区的有效数据,再求和。
步骤说明
- 定义优先级映射:将不同类型的flag按优先级赋值,高优先级对应更小的数值(比如
official优先级最高,赋值0;estimate次之,赋值1;以此类推)。 - 分组筛选有效数据:按
Area分组,每组内按优先级排序,保留优先级最高的那一行数据。 - 求和计算:对筛选后的生产值列求和。
代码实现
先构造示例数据:
import pandas as pd data = { 'Area': ['France', 'USA', 'Germany', 'Germany'], 'Y2017': [10, 11, 12, 10], 'Y2017flags': ['official', 'estimate', 'official', 'estimate'] } df = pd.DataFrame(data)
常规写法(新增优先级列)
# 定义优先级规则 priority_map = {'official': 0, 'estimate': 1, 'unofficial': 2} # 添加优先级辅助列 df['priority'] = df['Y2017flags'].map(priority_map) # 按Area分组,每组按优先级升序排序后取第一行(优先级最高的记录) selected_records = df.sort_values('priority').groupby('Area').first() # 计算总和 total_production = selected_records['Y2017'].sum() print(total_production) # 输出结果:33
简化写法(无需辅助列)
可以直接在排序时使用key参数,省去新增列的步骤:
priority_map = {'official': 0, 'estimate': 1, 'unofficial': 2} # 按优先级排序后分组取每个地区的有效生产值 valid_values = df.sort_values( by='Y2017flags', key=lambda col: col.map(priority_map) ).groupby('Area')['Y2017'].first() # 求和 total_production = valid_values.sum() print(total_production)
这种方法全程基于原DataFrame操作,没有拆分或复制数据,高效且符合需求。
内容的提问来源于stack exchange,提问作者Dahlai
相关产品推荐
相关产品推荐

