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

如何用Pandas按ID首次出现值反向填充catH列的NaN?

解决方案

要实现按需求填充catH列的NaN值,我们可以分步骤完成,核心是先记录每个ID首次出现的非NaNcatH值,再针对性填充该ID在首次出现行之前的NaN:

步骤1:读取数据

首先读取本地CSV文件:

import pandas as pd

df = pd.read_csv('test.csv')

步骤2:记录每个ID的关键信息

遍历数据,为每个ID存储其第一次出现的非NaNcatH值,同时记录该值所在的行索引:

# 存储每个ID首次出现的非NaN catH值
first_valid_cath = {}
# 存储每个ID首次出现非NaN catH的行索引
first_valid_idx = {}

for idx, row in df.iterrows():
    id_val = row['A']
    cath_val = row['catH']
    # 仅当ID未记录过,且当前catH非空时存储
    if id_val not in first_valid_cath and pd.notna(cath_val):
        first_valid_cath[id_val] = cath_val
        first_valid_idx[id_val] = idx

步骤3:针对性填充NaN

通过掩码筛选需要填充的行,并用首次有效值替换NaN:

# 映射每个ID的首次非NaN catH值到临时列
df['first_cath'] = df['A'].map(first_valid_cath)

# 创建掩码:catH为NaN,且当前行索引小于该ID的首次有效索引
fill_mask = pd.isna(df['catH']) & (df.index < df['A'].map(first_valid_idx))

# 填充符合条件的NaN值
df.loc[fill_mask, 'catH'] = df.loc[fill_mask, 'first_cath']

# 清理临时列
df.drop('first_cath', axis=1, inplace=True)

说明

  • 该方法仅填充每个ID首次出现非NaNcatH行之前的NaN值,完全保留首次出现行之后的所有数据(包括后续的NaN或不同值)。
  • 相比常规的groupby+bfill,这种实现严格遵循了需求逻辑,避免了后续不同值对填充结果的干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:30:17