
本文详解如何在 pandas dataframe 中对包含标题行、字符串列或 nan 值的混合数据中,精准提取并转换数值列(如温度),避免 typeerror: unsupported operand type(s) for -: ‘str’ and ‘int’ 错误。
在使用 Pandas 处理实测气象数据(如华氏温度转摄氏)时,一个常见误区是直接对整个 DataFrame 或未筛选的列进行循环计算,例如:
for f in data: c = round((f – 32) / 1.8, 1) # ❌ 报错:f 可能是字符串(如列名 ‘TEMP’)或 NaN
该写法失败的根本原因在于:data 是一个 DataFrame,for f in data 实际遍历的是列名(字符串),而非数据行;即使误用 data[‘TEMP’] 后未做类型校验,若列中混有非数值内容(如单位标记、注释文本)或存在 NaN,仍会触发类型错误。
✅ 正确做法是利用 Pandas 的向量化运算能力与自动类型兼容性,直接对目标数值列(如 ‘TEMP’, ‘MAX’, ‘MIN’)执行标量运算。Pandas 会自动跳过非数值项,并对 NaN 保持传播(即 NaN – 32 → NaN),无需手动过滤或异常捕获:
# ✅ 安全、高效、一行完成:自动忽略非数值,保留 NaN 语义data[‘TEMP_C’] = ((data[‘TEMP’] – 32) / 1.8).round(1)data[‘MAX_C’] = ((data[‘MAX’] – 32) / 1.8).round(1)data[‘MIN_C’] = ((data[‘MIN’] – 32) / 1.8).round(1)
? 关键注意事项:
不推荐 try/except 循环逐行处理:性能差、破坏向量化优势,且难以优雅处理 NaN;列名必须精确匹配:’TEMP’ ≠ ‘temp’,注意大小写与空格;NaN 是合法数值占位符:Pandas 所有算术运算天然支持 NaN,结果自动为 NaN,无需额外判断;避免修改原始列名所在行:确保数据已正确加载(header=0),首行为列名,非数据行。
最终,你的 DataFrame 将新增摄氏温度列,原始结构与缺失值逻辑完全保留,可直接用于后续分析或可视化:
print(data[[‘YEARMODA’, ‘TEMP’, ‘TEMP_C’, ‘MAX’, ‘MAX_C’]].head(3))# 输出示例:# YEARMODA TEMP TEMP_C MAX MAX_C# 0 20160601 65.5 18.6 73.6 23.1# 1 20160602 65.8 18.8 80.8 27.1# 2 20160603 68.4 20.2 NaN NaN
掌握这一模式,即可安全、简洁、高性能地处理各类含噪声的工程与科学数据表。

评论(0)