Pandas如何筛选过去3个月充值次数超2次的充值号码对应全部行?
Pandas数据筛选需求解答
原有代码问题说明
你给出的实现代码无法得到正确结果,核心问题如下:
- 分组逻辑错误:你将
year、month_n都加入了分组键,统计出的recharge_count是单月单账号单充值号码的充值次数,不是过去3个月的累计充值次数,和需求匹配不上 - 字段名不匹配:分组时使用的字段是
month,但数据集的月份字段为month_n,运行时会直接报字段不存在的错误 - 结果不符合要求:分组聚合操作会改变原数据结构,你后续的筛选只能得到聚合后的统计行,无法保留原数据的所有关联行
最优实现方案
实现逻辑很清晰,分两步操作即可:
- 先筛选出2021年4-6月的所有数据
- 统计该时间范围内每个充值号码的累计充值次数,保留次数超过2次的号码对应的所有行
代码如下:
# 第一步:筛选目标时间范围的数据 mask_time_range = (df['year'] == 2021) & (df['month_n'].between(4, 6)) df_target_period = df[mask_time_range] # 第二步:统计每个充值号的累计次数,过滤出次数>2的对应所有行 df_result = df_target_period[df_target_period.groupby('recharge_number')['recharge_number'].transform('count') > 2]
运行上述代码得到的df_result就和你给出的期望输出完全一致。
该方案的优势:
- 逻辑直观,没有多余的中间转换操作,执行效率高
- 完全保留原数据的字段和行结构,不会丢失原始信息
- 代码简洁易维护,后续如果要调整时间范围、次数阈值只需要修改对应参数即可
如果后续需要支持跨年的时间范围统计,只需要将year和month_n合并为datetime类型的时间字段再做筛选即可,当前场景无需额外处理。
内容的提问来源于stack exchange,提问作者asif abdullah
相关产品推荐
相关产品推荐

