You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas将DataFrame列中NaN替换为之前最近的最小值?

解决方案

要实现这个需求,我们需要先把连续的非NaN值划分为独立的组,计算每个组的最小值,再用对应组的最小值填充后续的NaN,同时保持非NaN值不变。具体步骤如下:

  1. 分组标记:用notna().cumsum()为连续的非NaN值创建唯一的分组标签,NaN会自动继承前一个非NaN组的标签;
  2. 计算组内最小值:针对每个非NaN组,计算该组的最小值;
  3. 映射填充:将分组标签映射为对应的组内最小值,然后将非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:42:40