如何用Pandas统计各ID的有效Activity记录天数及找出最大值?
解决方法
1. 统计每个ID的Activity>0的记录天数
Pandas的分组聚合操作完全可以替代嵌套循环,代码简洁且效率更高。推荐两种实现方式:
方式一:先筛选有效行再分组计数
先过滤出Activity>0的行,再按ID分组统计Date的数量(每个ID每天对应一条记录,计数结果就是有效天数):
import pandas as pd # 假设你的数据集变量名为df active_days_per_id = df[df['Activity'] > 0].groupby('ID')['Date'].count()
方式二:分组后直接计算有效天数
利用布尔值的特性(True等价于1,False等价于0),分组后对Activity>0的结果求和,直接得到每个ID的有效天数:
active_days_per_id = df.groupby('ID')['Activity'].gt(0).sum()
gt(0)是Pandas内置的大于比较方法,比手写lambda表达式更简洁高效。
执行后active_days_per_id会是一个Series,索引为ID,对应的值就是该ID的有效天数。
2. 找出记录天数最多的ID
基于上面得到的active_days_per_id,用Pandas内置方法就能快速得到结果:
# 获取天数最多的ID max_active_id = active_days_per_id.idxmax() # 获取对应的最大天数(可选) max_active_count = active_days_per_id.max() print(f"有效天数最多的ID是:{max_active_id},共{max_active_count}天")
为什么不推荐嵌套循环?
你原来的嵌套循环不仅代码繁琐,而且Pandas的DataFrame本身不适合行遍历的处理方式——Pandas的核心优势是向量化操作,能利用底层优化批量处理数据,比手动循环快几个数量级,数据量越大差距越明显。另外手动维护IDs列表和occ数组容易出错(比如ID不连续、新增ID时需要手动修改),而groupby会自动识别所有唯一ID,无需额外处理。
内容的提问来源于stack exchange,提问作者Getting a master at some point
相关产品推荐
相关产品推荐

