基于ID填充DataFrame中Col列NaN值(百万级数据高效方案需求)
根据ID高效填充DataFrame中列的NaN值
问题背景
需要按ID分组填充Col列的缺失值,示例数据如下(注意原始数据中的'NaN'是字符串,需先转为真正的缺失值):
import pandas as pd df = pd.DataFrame({ 'ID': [1,2,1,2,1,2], 'Col': ['One','NaN','NaN','Two','NaN','NaN'] }) # 转换字符串'NaN'为缺失值 df['Col'] = df['Col'].replace('NaN', pd.NA)
预期输出:
df = pd.DataFrame({ 'ID': [1,2,1,2,1,2], 'Col': ['One','Two','One','Two','One','Two'] })
高效解决方案(适用于百万级数据集)
以下两种方法均基于pandas向量化操作,避免循环,处理百万行数据效率极高:
方案1:构建ID-值映射字典填充
先提取每个ID对应的非缺失值,构建映射字典后批量填充:
# 提取每个ID对应的有效Col值(取第一个非缺失值,适合每个ID仅存一个有效值的场景) id_col_map = df.dropna(subset=['Col']).set_index('ID')['Col'].to_dict() # 用映射填充所有缺失值 df['Col'] = df['ID'].map(id_col_map)
方案2:分组后双向填充
通过groupby分组,结合ffill()(向前填充)和bfill()(向后填充)确保所有缺失值被覆盖,适合每个ID可能存在多个非缺失值的场景:
df['Col'] = df.groupby('ID')['Col'].transform(lambda x: x.ffill().bfill())
对您尝试代码的说明
您之前的代码仅针对单个ID(id='2')处理,无法批量覆盖所有ID,且手动筛选单ID的方式在百万级数据集中效率极低,建议改用上述批量处理方案。
内容的提问来源于stack exchange,提问作者Shawn Jamal
相关产品推荐
相关产品推荐

