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

如何按Solar.R分段条件替换pandas DataFrame中Ozone列的缺失值

问题根源

你之前代码出现非NaN值被修改的核心原因有2个:

  • 没有在loc筛选条件中加入仅匹配Ozone列为NaN的限制,导致所有符合Solar.R条件的行都被修改
  • 条件顺序从低到高写会出现覆盖问题:比如Solar.R=30同时满足<50、<100直到<350的所有条件,最终会被最后一行的<350对应的赋值覆盖,完全不符合需求
  • 额外冗余问题:不需要加while循环,pandas支持向量化操作,一次匹配即可完成所有缺失值替换,你赋值的字符串类型数值也会导致列类型异常,建议直接使用数值类型。

正确实现方案

方案1:用loc实现(和你原写法逻辑接近)

注意条件从大到小匹配,同时加入Ozone为NaN的限制:

# 仅修改Ozone为NaN的行,从大区间到小区间匹配避免覆盖
s.loc[s['Ozone'].isna() & (s['Solar.R'] < 350), 'Ozone'] = 26.571429
s.loc[s['Ozone'].isna() & (s['Solar.R'] < 300), 'Ozone'] = 50.115385
s.loc[s['Ozone'].isna() & (s['Solar.R'] < 250), 'Ozone'] = 59.840000
s.loc[s['Ozone'].isna() & (s['Solar.R'] < 200), 'Ozone'] = 59.840000
s.loc[s['Ozone'].isna() & (s['Solar.R'] < 150), 'Ozone'] = 53.13043
s.loc[s['Ozone'].isna() & (s['Solar.R'] < 100), 'Ozone'] = 21.181818
s.loc[s['Ozone'].isna() & (s['Solar.R'] < 50), 'Ozone'] = 30.166667

方案2:用pd.cut实现(更简洁,易维护)

通过分箱操作一次性完成区间匹配,不需要写多行loc:

import pandas as pd

# 定义区间边界和对应替换值,right=False表示区间左闭右开,完全匹配你的需求
bins = [0, 50, 100, 150, 200, 250, 300, 350]
replace_values = [30.166667, 21.181818, 53.13043, 59.84, 59.84, 50.115385, 26.571429]

# 仅给Ozone为缺失值的行赋值
s.loc[s['Ozone'].isna(), 'Ozone'] = pd.cut(
    s.loc[s['Ozone'].isna(), 'Solar.R'],
    bins=bins,
    labels=replace_values,
    right=False
)

因为你需求中150-200和200-250区间的替换值相同,还可以把bins合并为[0,50,100,150,250,300,350],replace_values调整为[30.166667,21.181818,53.13043,59.84,50.115385,26.571429],进一步精简代码。

内容的提问来源于stack exchange,提问作者sri varsha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:06:02