如何用Pandas为Period列填充缺失月份并设置X值为0?
Pandas填充Period列缺失月份的优雅方案
问题场景
现有包含Period类型月份列的DataFrame:
P X 0 2021-02 4 1 2021-04 99 2 2021-07 41 3 2021-08 43
需要填充2021年2月至8月之间的缺失月份,对应X值设为0,得到目标结果:
P X 0 2021-02 4 1 2021-03 0 2 2021-04 99 3 2021-05 0 4 2021-06 0 5 2021-07 41 6 2021-08 43
生成原始数据的最小可复现代码:
#!/usr/bin/env python3 import pandas as pd df = pd.DataFrame({ 'P': [pd.Period(f'2021-0{m}', freq='M') for m in [2, 4, 7, 8]], 'X': [4, 99, 41, 43], }) print(df)
优雅解决方案
无需循环,用Pandas内置的时间序列处理方法即可实现,以下是两种常用方案:
方法一:使用reindex
通过生成完整的月份Period序列,重新索引填充缺失项:
# 将P列设为索引 df = df.set_index('P') # 生成从最小到最大月份的完整序列 full_periods = pd.period_range(start=df.index.min(), end=df.index.max(), freq='M') # 重新索引并填充缺失值为0,最后恢复原结构 df = df.reindex(full_periods, fill_value=0).reset_index().rename(columns={'index': 'P'}) print(df)
方法二:使用resample
利用重采样功能直接补全缺失月份,适合时间序列场景:
# 设置Period索引后按月份重采样,缺失值填充为0 df = df.set_index('P').resample('M').sum().fillna(0).reset_index() print(df)
注:这里用sum()是因为原数据每个月份仅一条记录,若存在重复月份数据,可根据需求替换为first()/mean()等聚合方法。
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

