Pandas基于类PeriodIndex字符串补全缺失季度及均值填充问题求助
问题与解决方案
问题背景
给定以下DataFrame:
import pandas as pd df = pd.DataFrame({'subject_id':[1,1,1,1,1,2,2,2,2,2], 'qtr_info' :['2017Q1','2017Q3','2017Q4','2018Q1','2018Q4','2017Q1','2017Q4','2018Q2','2018Q4','2019Q1'], 'val' :[5,5,5,5,1,6,5,5,8,3], 'Prod_id':['A','B','C','A','E','Q','G','F','G','H']})
需要完成两项任务:
- 补全每个
subject_id对应的所有缺失季度 - 仅使用同一
subject_id的列均值填充缺失值,不跨组计算
尝试使用resample方法时触发错误:
TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Int64Index'
期望输出以subject_id=1为例:需补全2017Q2、2018Q2、2018Q3三个季度的行,新增行的val用该subject的均值填充,其他列可按组内规律补充。
解决方案
1. 转换季度列为周期类型
resample要求索引为时间相关类型,先将qtr_info转为Period类型:
df['qtr_info'] = pd.PeriodIndex(df['qtr_info'], freq='Q-DEC')
2. 按subject分组补全缺失季度
对每个subject_id分组,生成该组时间范围内的所有季度,再与原数据合并:
def fill_missing_quarters(group): # 获取当前组的时间起止 start = group['qtr_info'].min() end = group['qtr_info'].max() # 生成该区间内的所有季度 all_quarters = pd.period_range(start=start, end=end, freq='Q-DEC') # 构建包含所有季度的基础表 full_quarters = pd.DataFrame({ 'qtr_info': all_quarters, 'subject_id': group['subject_id'].iloc[0] }) # 合并原数据,保留所有行(缺失值为NaN) return pd.merge(full_quarters, group, on=['subject_id', 'qtr_info'], how='left') # 应用到所有分组并重置索引 df_complete = df.groupby('subject_id').apply(fill_missing_quarters).reset_index(drop=True)
3. 按组填充缺失值
- 对
val列:用当前subject_id的组内均值填充NaN - 对
Prod_id列:可选用组内众数填充(若有多个众数取第一个)
# 填充val列的缺失值 df_complete['val'] = df_complete.groupby('subject_id')['val'].transform( lambda x: x.fillna(x.mean()) ) # 可选:填充Prod_id列的缺失值(组内众数) def fill_with_mode(x): mode = x.mode() return x.fillna(mode.iloc[0] if not mode.empty else None) df_complete['Prod_id'] = df_complete.groupby('subject_id')['Prod_id'].transform(fill_with_mode)
最终结果示例(subject_id=1)
| subject_id | qtr_info | val | Prod_id |
|---|---|---|---|
| 1 | 2017Q1 | 5.0 | A |
| 1 | 2017Q2 | 4.2 | A |
| 1 | 2017Q3 | 5.0 | B |
| 1 | 2017Q4 | 5.0 | C |
| 1 | 2018Q1 | 5.0 | A |
| 1 | 2018Q2 | 4.2 | A |
| 1 | 2018Q3 | 4.2 | A |
| 1 | 2018Q4 | 1.0 | E |
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

