Python中Pandas按date分组后过滤不含女性记录分组的优化方法
解决方案
你提到的str.contains写法确实不必要,你需要的是精准匹配sex等于F的场景,不需要模糊匹配,直接用等值判断更准确也更高效,下面提供两种常用的实现方案:
1. 可读性优先(小数据量场景)
如果你的数据量不大,追求代码简洁易读,可以直接优化原有的groupby.filter写法:
df_filter = df_exam.groupby("date").filter(lambda gr: (gr["sex"] == "F").any())
- 优势:代码逻辑直观,和业务需求的描述完全对应:按date分组,保留组内存在sex=F的分组
- 劣势:大数据量下性能一般,需要遍历每个分组执行lambda函数
2. 性能优先(大数据量场景,行业常用写法)
工业界处理大批量数据时更推荐先筛选有效分组键,再过滤全表的思路,全程用pandas矢量化操作,避免分组迭代,性能提升非常明显:
# 提取所有包含女性记录的日期 valid_dates = df_exam.loc[df_exam["sex"] == "F", "date"].unique() # 过滤原表只保留符合要求的日期数据 df_filter = df_exam[df_exam["date"].isin(valid_dates)]
- 优势:性能比
groupby.filter高5~10倍(百万行以上数据差距更明显),通用性极强,修改判断条件就能适配其他分组过滤需求 - 验证:用你提供的示例数据运行,会自动过滤掉没有女性的
2000-2、2000-4两个分组,结果完全符合预期
内容的提问来源于stack exchange,提问作者Erwin
相关产品推荐
相关产品推荐

