如何使用groupby按每365行分组统计指定列各数值出现次数
按每365行分组统计列值出现次数的实现方法
你的数据集是严格按时间顺序排列、每年固定365行、总计11315行的结构化表,直接用行号生成分组键调用groupby即可,不需要额外解析日期字段。
具体实现代码
假设你已经将数据集读取为pandas DataFrame,变量名为df,将代码中的目标列替换为你自己的实际列名即可运行:
import pandas as pd import numpy as np # 替换为你要统计的实际列名 target_column = "你的目标列名" # 每365行生成同一个分组ID,作为groupby的分组依据 group_key = np.arange(len(df)) // 365 # 分组统计各取值出现次数,转成宽表格式,缺失值填充0 stat_result = df.groupby(group_key)[target_column].value_counts().unstack(fill_value=0) # 固定列顺序为5、7、8、9,避免列排序随机 stat_result = stat_result.reindex(columns=[5, 7, 8, 9], fill_value=0) # 可选:将分组索引从0-30改为1-31,对应第1到第31年 stat_result.index = range(1, 32)
结果说明
最终输出的stat_result结构如下:
- 行索引:对应年份分组,共31行
- 列:分别对应取值5、7、8、9
- 单元格值:对应取值在当年365行数据中的出现次数
关键逻辑说明
- 分组键用
np.arange(len(df)) // 365生成:行序号0-364整除365得到分组0、365-729得到分组1,以此类推,刚好将11315行拆分为31个每组365行的分组,完全匹配按年拆分的需求,性能远高于日期解析类方法。 value_counts()直接统计每个分组内目标列各取值的出现频次,不需要手动编写计数逻辑。unstack(fill_value=0)将多层索引的计数结果转为宽表格式,某分组未出现的取值会自动填充为0,不会残留空值。- 最后用
reindex固定列顺序为5、7、8、9,避免pandas自动排序导致的列顺序混乱。
内容的提问来源于stack exchange,提问作者babak asadolah
相关产品推荐
相关产品推荐

