You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言中按规则填充DataFrame缺失值的实现方法

解决方案

明确需求:按ID分组,仅当某行的value为缺失值(示例中用-8、-9标记),且该行前后均有非缺失值且数值相等时,才用该数值填充缺失值;若缺失值在组的首尾,或前后值不等,则不填充。

实现步骤(Pandas)

  1. 将数据中的缺失标记(如-8、-9)替换为标准缺失值NaN,方便后续逻辑判断
  2. 按ID分组,对每个组的value列执行条件填充
  3. 按需将未填充的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)

输出结果

IDYearvalue
120161
120171
120181
22016-8
220172
220182
220192
220202
320174
320184
32019-9

关键逻辑说明

  • shift(1)和shift(-1)分别获取当前行的前一行、后一行数值
  • 构造的mask严格限定填充条件,避免误填充不符合规则的缺失值
  • 分组处理确保每个ID的逻辑独立,不会跨ID引用数据

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:40:29