在R语言中按规则填充DataFrame缺失值的实现方法
解决方案
明确需求:按ID分组,仅当某行的value为缺失值(示例中用-8、-9标记),且该行前后均有非缺失值且数值相等时,才用该数值填充缺失值;若缺失值在组的首尾,或前后值不等,则不填充。
实现步骤(Pandas)
- 将数据中的缺失标记(如-8、-9)替换为标准缺失值
NaN,方便后续逻辑判断 - 按ID分组,对每个组的value列执行条件填充
- 按需将未填充的NaN还原为原缺失标记(可选)
代码示例
import pandas as pd import numpy as np # 构造示例数据 data = { 'ID': [1,1,1,2,2,2,2,2,3,3,3], 'Year': [2016,2017,2018,2016,2017,2018,2019,2020,2017,2018,2019], 'value': [1,-8,1,-8,2,2,-8,2,4,4,-9] } df = pd.DataFrame(data) # 替换缺失标记为NaN df['value'] = df['value'].replace([-8, -9], np.nan) # 分组处理缺失值 def fill_missing(group): # 获取前后行的value值 prev_val = group['value'].shift(1) next_val = group['value'].shift(-1) # 筛选符合填充条件的行:当前值为NaN,且前后值非空相等 mask = group['value'].isna() & (prev_val == next_val) & prev_val.notna() & next_val.notna() # 填充符合条件的缺失值 group.loc[mask, 'value'] = prev_val[mask] return group df_filled = df.groupby('ID', group_keys=False).apply(fill_missing) # 可选:将未填充的NaN还原为原缺失标记 df_filled['value'] = df_filled['value'].fillna(df['value']) print(df_filled)
输出结果
| ID | Year | value |
|---|---|---|
| 1 | 2016 | 1 |
| 1 | 2017 | 1 |
| 1 | 2018 | 1 |
| 2 | 2016 | -8 |
| 2 | 2017 | 2 |
| 2 | 2018 | 2 |
| 2 | 2019 | 2 |
| 2 | 2020 | 2 |
| 3 | 2017 | 4 |
| 3 | 2018 | 4 |
| 3 | 2019 | -9 |
关键逻辑说明
shift(1)和shift(-1)分别获取当前行的前一行、后一行数值- 构造的
mask严格限定填充条件,避免误填充不符合规则的缺失值 - 分组处理确保每个ID的逻辑独立,不会跨ID引用数据
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

