Pandas使用resample按月统计时如何保留缺失月份并填充0
实现方案
核心逻辑是先构造「所有公司+所有method类型+2020年12个月末」的全量维度组合,再和实际统计结果对齐,无数据的位置自动补0,具体代码如下:
步骤1:先做基础月度统计
和你原有逻辑一致,先统计出有数据的月份的调用次数:
import pandas as pd # 基础统计得到三级索引:[name_normalized, method, day(月末日期)],值为调用次数 rep_month = Only2020_PPC.groupby(['name_normalized','method']).resample("M")['method'].count() rep_month.name = 'call_count' # 给计数列命名,方便后续处理
步骤2:构造全量维度索引
生成三个维度的唯一值,再做笛卡尔积得到所有可能的组合:
# 提取所有维度的唯一值 all_companies = Only2020_PPC['name_normalized'].unique() all_methods = Only2020_PPC['method'].unique() # 生成2020年1-12月所有月末日期 all_2020_months = pd.date_range(start='2020-01-01', end='2020-12-31', freq='M') # 生成全量多重索引,层级顺序和前面统计结果的索引顺序完全一致 full_index = pd.MultiIndex.from_product( [all_companies, all_methods, all_2020_months], names=['name_normalized', 'method', 'day'] )
步骤3:索引对齐补0
用全量索引重排统计结果,缺失值填充为0:
# 对齐全量索引,无数据的位置补0 rep_month_full = rep_month.reindex(full_index, fill_value=0).reset_index() # 如果需要和你给出的预期示例格式一致,可将day、method设为索引 rep_month_full = rep_month_full.set_index(['day', 'method']).sort_index()
完成后你可以验证eole medical的统计结果,2020年12个月份都会存在,无业务的月份调用次数为0。
内容的提问来源于stack exchange,提问作者jer_card
相关产品推荐
相关产品推荐

