
本文详解如何在 pandas dataframe 中对包含标题行、字符串列或 nan 值的混合数据中,精准提取并转换数值列(如温度),避免 typeerror: unsupported operand type(s) for -: 'str' and 'int' 错误。
本文详解如何在 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)
? 验证数据类型:执行前建议确认目标列为数值型(float64 或 Int64),可使用 data['TEMP'].dtype 检查。若列被误读为 object(常因首行含文本或空格导致),需预处理:
data['TEMP'] = pd.to_numeric(data['TEMP'], errors='coerce') # 强制转数值,非法值→NaN
? 关键注意事项:
- 不推荐 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
掌握这一模式,即可安全、简洁、高性能地处理各类含噪声的工程与科学数据表。










