Pandas:补全DataFrame中缺失的月份记录
解决方法:补全邮政编码缺失月份的累计购买量记录
Got it, let's work through this problem to fill in those missing monthly entries for each zipcode by carrying forward the last known cumulative purchase value. Here's a step-by-step approach using pandas:
1. 准备工作:转换日期格式
首先,我们需要把Date列转换成datetime类型,这样才能方便生成连续的时间序列。原数据的日期格式是"Month Year"(比如December 2018),所以用pd.to_datetime配合format='%B %Y'来解析:
import pandas as pd # 你的示例数据 data = { 'Zipcode': ['9999', '9999', '9999', '9999', '9999', '2400', '2400', '2400'], 'Date': ['December 2018', 'January 2019', 'February 2019', 'March 2019', 'April 2019', 'December 2018', 'January 2019', 'February 2019'], 'Cumulative purchases': [2, 2, 2, 3, 4, 2, 3, 4] } df = pd.DataFrame(data) # 转换日期为datetime类型 df['Date'] = pd.to_datetime(df['Date'], format='%B %Y')
2. 分组补全缺失月份
接下来,我们按Zipcode分组,为每个组生成完整的月份序列,然后用**向前填充(forward fill)**来补全缺失的累计购买量:
def process_zipcode_group(group): # 生成当前zipcode下从最早到最晚日期的所有月份(用'M'表示每月最后一天,保证和原数据时间对齐) full_month_range = pd.date_range(start=group['Date'].min(), end=group['Date'].max(), freq='M') # 重新索引到完整月份,并用上一个非缺失值填充空缺 filled_group = group.set_index('Date').reindex(full_month_range).ffill() # 恢复Date列为普通列,重置索引 filled_group = filled_group.reset_index().rename(columns={'index': 'Date'}) return filled_group # 对每个zipcode应用处理函数 filled_df = df.groupby('Zipcode', group_keys=False).apply(process_zipcode_group)
3. 恢复原日期格式
最后,把datetime类型的Date列转回你需要的"Month Year"字符串格式:
filled_df['Date'] = filled_df['Date'].dt.strftime('%B %Y') # 重置行索引,让结果更整洁 filled_df = filled_df.reset_index(drop=True)
最终结果
运行完上面的代码后,filled_df就会包含每个zipcode的完整月份记录,缺失的月份会用上一个月的累计购买量填充,和你想要的输出完全一致:
| Zipcode | Date | Cumulative purchases | |
|---|---|---|---|
| 0 | 9999 | December 2018 | 2 |
| 1 | 9999 | January 2019 | 2 |
| 2 | 9999 | February 2019 | 2 |
| 3 | 9999 | March 2019 | 3 |
| 4 | 9999 | April 2019 | 4 |
| 5 | 2400 | December 2018 | 2 |
| 6 | 2400 | January 2019 | 3 |
| 7 | 2400 | February 2019 | 4 |
| 8 | 2400 | March 2019 | 4 |
| 9 | 2400 | April 2019 | 4 |
关键细节说明
pd.date_range的freq参数:用'M'会生成每月最后一天,和原数据的“Month Year”语义匹配;如果需要月初,换成'MS'即可,不影响补全逻辑。ffill():专门用来向前填充缺失值,正好符合你“重复上一个月累计值”的需求。- 分组处理:确保每个zipcode独立计算自己的日期范围,不会和其他zipcode的日期混淆。
内容的提问来源于stack exchange,提问作者TvCasteren
相关产品推荐
相关产品推荐

