Python DataFrame含NaN的列如何替换负值为0且保留NaN
报错原因
代码触发类型比较错误,是因为Data列当前为混合类型,存在字符串格式的值,字符串和整数/浮点数无法直接做大小比较。
实现方案
不需要写多条件筛选行的复杂逻辑,两步操作即可满足需求,同时自动解决类型问题、保留原有NaN值:
- 先将列安全转换为数值类型,统一数据格式
- 用下界截断方法直接把小于0的值替换为0,NaN不会被改动
对应代码:
import pandas as pd # 安全转换列为数值类型,无法解析的异常值转为NaN,不影响原有正常数值和NaN df['Data'] = pd.to_numeric(df['Data'], errors='coerce') # 截断所有小于0的值为0,大于0的值保持原样,NaN自动保留 df['Data'] = df['Data'].clip(lower=0)
如果确认列内没有无法转数值的脏数据,可以合并为一行写法:
df['Data'] = pd.to_numeric(df['Data'], errors='coerce').clip(lower=0)
执行后得到的结果和预期完全一致:
Data 0 1.0 1 0.5 2 0.0 3 0.0 4 0.0 5 NaN 6 NaN
说明:如果需要保留整数位的数值格式,可以在转换后追加
.astype('Int64')(pandas支持带NaN的整数类型)即可,不会改变替换逻辑。
内容的提问来源于stack exchange,提问作者Elizabeth
相关产品推荐
相关产品推荐

