如何在Pandas中按周统计时间序列中值为1的出现次数
按周聚合统计指定值出现次数的解决方案
嘿,我来帮你搞定这个问题!你之前用count()确实会统计所有行数,没法针对性统计above_five=1的情况,换个方法就好啦,步骤很清晰:
第一步:先把日期列转成datetime类型
因为resample需要处理日期时间格式的数据,所以先做个转换(你的日期是日/月/年格式,所以指定format='%d/%m/%Y'):
df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y')
第二步:按周聚合并统计1的出现次数
直接对above_five列用sum()就可以啦——因为1加起来就是出现的次数,0不会影响结果,完美契合你的需求:
# 按周聚合,sum统计1的次数 final_df = df.resample('W', on='date')['above_five'].sum().reset_index() # 把列名改成你想要的名字 final_df.rename(columns={'above_five': 'above_five_counts'}, inplace=True)
关于周标识的小调整
默认resample('W')会用每周的周日作为周的标识日期,如果你想改成周一(因为你假设2021年2月1日是周一),只需要把参数改成'W-MON':
final_df = df.resample('W-MON', on='date')['above_five'].sum().reset_index()
这样结果里的date列就会显示每周的周一日期。要是你想显示成"Week 1"这种格式,再加一行格式转换:
final_df['date'] = final_df['date'].dt.strftime('Week %U')
最终你会得到的结果
按照你的示例数据,运行后会得到:
| date | above_five_counts |
|---|---|
| 2021-02-07 | 2 |
(如果用W-MON的话,date会是2021-02-01,对应Week 05,因为2021年2月第一周是第5周)
为啥之前的count()不行?
count()是统计分组里所有非空的行数,不管值是0还是1,所以会把所有行都算进去。而sum()刚好适配你这种0/1标记的场景,直接累加1的数量,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Denver Dang
相关产品推荐
相关产品推荐

