如何基于col1对应值批量替换col2中的NaN值(大数据集场景)
高效填充分组内缺失值方案
问题场景
你的数据集按col1分组后,每组仅存在一个col2有效值,其余为NaN,需要将组内所有NaN替换为对应组的有效值,且数据集规模庞大(col1含数千种取值)。
示例输入:
col1 col2 a 10 a NaN a NaN b 19 b NaN b NaN
期望输出:
col1 col2 a 10 a 10 a 10 b 19 b 19 b 19
解决方案
以下两种方法均为向量化操作,避免了apply()的逐行低效处理,适合大规模数据集:
方法1:groupby + transform 直接填充
利用groupby分组后,通过transform提取组内唯一有效值并填充缺失值:
import pandas as pd # 假设你的数据集存储在df中 df['col2'] = df.groupby('col1')['col2'].transform(lambda x: x.fillna(x.first()))
或更简洁的写法:
df['col2'] = df['col2'].fillna(df.groupby('col1')['col2'].transform('first'))
注:因为每组仅一个有效值,first()/last()/max()/min()效果一致,任选其一即可。
方法2:提取有效值后合并填充
先提取每组的有效值,再通过合并方式批量填充:
# 提取每组的唯一有效值(去重避免重复合并) group_valid_vals = df.dropna(subset=['col2']).drop_duplicates('col1') # 合并原数据集与有效值表 df = df.merge(group_valid_vals, on='col1', suffixes=('', '_filled')) # 替换缺失值并清理临时列 df['col2'] = df['col2'].fillna(df['col2_filled']) df.drop(columns='col2_filled', inplace=True)
这两种方法都能高效处理数千个分组的大数据集,性能远优于apply()逐行处理。
内容的提问来源于stack exchange,提问作者code brown
相关产品推荐
相关产品推荐

