如何在Pandas DataFrame中按日期统计非零值数量生成计数列
实现方法
你可以通过pandas的分组+transform广播特性快速实现需求,核心逻辑是按日期分组后统计每组非0值的数量,再将统计结果映射到同组的所有行:
核心代码
df['count'] = df.groupby('date')['value'].transform(lambda x: (x != 0).sum())
逻辑说明
- 先通过
groupby('date')将数据按日期字段拆分为多个独立分组 - 对每个分组的
value列执行计算:(x != 0).sum()会先把非0值标记为1、0值标记为0,求和结果就是当前日期下非0值的总条数 transform方法会把每组计算出的单个统计值,自动赋值给组内的所有行,不会改变原数据的行数,刚好满足同日期所有行count值统一的要求。哪怕value为负数,只要不等于0都会被正常统计,完全匹配你给出的预期输出规则。
完整测试代码
你可以运行以下代码验证效果:
import pandas as pd # 构造示例DataFrame data = { 'date': ['01/01/2020']*4 + ['02/01/2020']*4 + ['03/01/2020']*4, 'value': [2, 3, 0, 4, 1, 3, 8, 4, 0, 0, 1, 0] } df = pd.DataFrame(data) # 新增count列 df['count'] = df.groupby('date')['value'].transform(lambda x: (x != 0).sum()) # 输出结果 print(df)
内容的提问来源于stack exchange,提问作者Stacey
相关产品推荐
相关产品推荐

