如何用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首次出现非NaN
catH行之前的NaN值,完全保留首次出现行之后的所有数据(包括后续的NaN或不同值)。 - 相比常规的
groupby+bfill,这种实现严格遵循了需求逻辑,避免了后续不同值对填充结果的干扰。
内容的提问来源于stack exchange,提问作者desmond
相关产品推荐
相关产品推荐

