如何从pandas DataFrame折扣列中提取纯数值并解决处理返回nan的问题
失效原因排查
之前的代码返回全nan主要有几个常见问题:
- 列名大小写不匹配:原列名为
Discount(首字母大写),如果代码中使用全小写的discount取列,会直接返回空值填充为nan - 字符串方法使用错误:
lstrip/rstrip是按字符集合匹配而非完整字符串匹配,且删除%的方向完全错误;仅替换off没有处理%和中间的空格,也达不到效果 - 列类型问题:如果
Discount列不是字符串(object)类型,直接调用.str类方法会返回nan
可行解决方案
推荐方案:正则提取(稳定性最高)
不受多余字符干扰,直接匹配字符串中的连续数字,一步得到结果:
# 提取连续数字后转为整数类型 df['discount'] = df['Discount'].str.extract(r'(\d+)', expand=False).astype(int)
固定格式分割方案
如果确认所有值的格式严格为数字% off,也可以用拆分法实现:
# 按空格拆分取第一个元素,删除末尾百分号后转整数 df['discount'] = df['Discount'].str.split().str[0].str.rstrip('%').astype(int)
异常排查
如果执行后仍出现nan,可先执行以下操作排查基础问题:
- 确认列名是否正确:执行
print(df.columns)核对列名大小写 - 强制转换列类型为字符串:执行
df['Discount'] = df['Discount'].astype(str)后再运行处理代码
内容的提问来源于stack exchange,提问作者Swat1999
相关产品推荐
相关产品推荐

