如何用Pandas统计从首日到末日的每日记录数并按类别分列
Pandas实现连续日期的分类记录数统计
原始数据
import pandas as pd df = pd.DataFrame({ 'day': ['2022-07-01', '2022-07-01', '2022-07-03', '2022-07-05', '2022-07-07', '2022-07-07'], 'category': ['A', 'B', 'A', 'A', 'B', 'B'], 'value': [1, 2, 3, 4, 5, 6] })
完整解决方案代码
# 转换日期格式为datetime类型 df['day'] = pd.to_datetime(df['day']) # 按日期+类别分组统计记录数,将类别转为列并填充缺失值为0 count_df = df.groupby(['day', 'category']).size().unstack(fill_value=0) # 生成首尾日期之间的连续每日日期序列 full_date_range = pd.date_range(start=df['day'].min(), end=df['day'].max(), freq='D') # 对齐连续日期、补全0并整理输出格式 result = count_df.reindex(full_date_range)\ .fillna(0)\ .astype(int)\ .reset_index()\ .rename(columns={'index': 'day'}) print(result)
步骤说明
- 日期格式转换:把
day列转为datetime类型,确保后续日期序列生成和索引对齐逻辑正常运行。 - 分组统计:通过
groupby按日期和类别分组,用size()统计每组记录数;unstack(fill_value=0)直接将类别取值转为列,同时给当前日期不存在的类别自动填充0。 - 生成连续日期:使用
pd.date_range生成从数据最早日期到最晚日期的连续每日序列,freq='D'指定按天生成。 - 对齐补全:用
reindex将统计结果的索引替换为连续日期,缺失日期对应的数值用fillna(0)补0,最后转整数类型、重置索引并修正列名,得到目标格式。
输出结果
day A B 0 2022-07-01 1 1 1 2022-07-02 0 0 2 2022-07-03 1 0 3 2022-07-04 0 0 4 2022-07-05 1 0 5 2022-07-06 0 0 6 2022-07-07 0 2
内容的提问来源于stack exchange,提问作者김진원
相关产品推荐
相关产品推荐

