Pandas筛选所有年份较上年增幅均大于0的国家分组
Pandas筛选分组内所有记录满足指定条件的实现
前置处理
已完成数据聚合与同比字段计算,对应代码如下:
grouped=exp.groupby(["country","year"])["value"].sum().reset_index().sort_values(["country","year"]) grouped["prev_year"]=grouped.groupby("country")["value"].apply(lambda x:x.shift(1)) grouped["increase_vs_prev_year"]=((100*grouped.value-grouped.prev_year)/grouped.prev_year-100).round(1)
处理后的grouped表包含国家、年份、当年指标值、上年指标值、同比增幅五个核心字段。
需求
筛选出所有统计年份中,increase_vs_prev_year(同比增幅)字段值全部大于0的国家对应的全量记录。
实现代码
# 按国家分组,判断每个国家的所有非空同比增幅是否全部大于0 country_filter = grouped.groupby("country")["increase_vs_prev_year"].apply( lambda x: x.dropna().gt(0).all() ) # 过滤原表,保留符合要求的国家的所有记录 res = grouped[grouped["country"].isin(country_filter[country_filter].index)]
关键说明
- 每个国家的首年记录没有上年同期数据,同比增幅为空值,判断时用
dropna()跳过这类空值,避免结果出错 gt(0).all()是分组全满足判断的核心逻辑,只有组内所有非空值都大于0时,对应国家才会被标记为符合要求- 如果业务逻辑里首年的同比增幅有自定义填充值,把
dropna()替换成对应过滤规则即可
内容的提问来源于stack exchange,提问作者beridzeg45
相关产品推荐
相关产品推荐

