如何用Pandas将DataFrame列中NaN替换为之前最近的最小值?
解决方案
要实现这个需求,我们需要先把连续的非NaN值划分为独立的组,计算每个组的最小值,再用对应组的最小值填充后续的NaN,同时保持非NaN值不变。具体步骤如下:
- 分组标记:用
notna().cumsum()为连续的非NaN值创建唯一的分组标签,NaN会自动继承前一个非NaN组的标签; - 计算组内最小值:针对每个非NaN组,计算该组的最小值;
- 映射填充:将分组标签映射为对应的组内最小值,然后将非NaN值替换回原值(因为分组最小值可能不等于当前行的值)。
完整代码片段
import pandas as pd import numpy as np # 假设你的DataFrame名为df,包含'A_col'列 # 这里先构造示例数据匹配你的输出 data = { 'A_col': [np.nan]*7 + [-0.34, np.nan, np.nan, -0.19, np.nan, -0.37, -0.41, -0.33] + [np.nan]*5 + [-1.65, -1.8, -1.53, -1.35, np.nan, -0.19, -0.14, np.nan, -0.21] } df = pd.DataFrame(data) # 步骤1:创建分组标签,连续非NaN为同一组,NaN继承前组标签 df['group'] = df['A_col'].notna().cumsum() # 步骤2:计算每个非NaN组的最小值 group_min = df[df['A_col'].notna()].groupby('group')['A_col'].min() # 步骤3:映射填充,并保留非NaN原值 df['A_col_fill'] = df['group'].map(group_min) df.loc[df['A_col'].notna(), 'A_col_fill'] = df.loc[df['A_col'].notna(), 'A_col'] # 清理临时分组列 df = df.drop('group', axis=1) # 查看结果 print(df)
代码解释
- 分组标记:
df['A_col'].notna()会生成布尔序列,cumsum()会将连续的True(非NaN)累加为同一个整数标签,False(NaN)则保持前一个标签值,这样每个NaN都能关联到最近的非NaN组; - 组内最小值计算:筛选出非NaN行,按分组标签聚合计算最小值,得到每个组对应的最小数值;
- 填充逻辑:先通过映射将所有行替换为对应组的最小值,再将非NaN行的值还原为原始值,这样既保证了NaN填充最近非NaN组的最小值,又保留了非NaN行的原始数据。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

