如何通过Groupby高效填充Pandas DataFrame中的NaN值
高效按组替换Pandas DataFrame中的NaN值
针对你需要按组将所有NaN替换为组内非NaN值的需求,最直接高效的方法是结合groupby与transform,一次完成组内填充操作,避免多次fillna或合并的额外开销。
实现代码
首先构造输入数据:
import pandas as pd import numpy as np df = pd.DataFrame({ 'col1': ['A', 'A', 'A', 'B', 'B', 'B'], 'col2': [np.nan, np.nan, "'apples'", np.nan, "'bananas'", np.nan] })
核心填充逻辑:
# 按col1分组,将每组的NaN替换为组内第一个非NaN值 df['col2'] = df.groupby('col1')['col2'].transform(lambda x: x.dropna().iloc[0])
原理说明
groupby('col1')按指定列完成分组transform将传入的函数应用到每个分组,返回与原DataFrame长度匹配的结果,直接映射回原列x.dropna().iloc[0]提取每组中的第一个非NaN值(适用于每组仅有唯一非NaN值的场景;若组内有多个非NaN且需统一填充,可根据需求替换为众数、均值等逻辑)
执行后得到的结果与你期望的输出完全一致:
| col1 | col2 |
|---|---|
| A | 'apples' |
| A | 'apples' |
| A | 'apples' |
| B | 'bananas' |
| B | 'bananas' |
| B | 'bananas' |
性能优势
这种方法只需一次分组遍历即可完成填充,相比先ffill再bfill的两次遍历,或构造新DataFrame合并的方式,在数据量较大时能显著减少处理时间,逻辑也更简洁直观。
内容的提问来源于stack exchange,提问作者Samesand
相关产品推荐
相关产品推荐

