本文讲解如何在 pandas dataframe 中对温度等数值列进行单位换算(如 ℉→℃)时,自动跳过非数值内容(如列名、字符串、nan),避免 `typeerror: unsupported operand type(s) for -: ‘str’ and ‘int’` 错误。
在使用 Pandas 处理气象、实验或传感器数据时,常需对数值列(如 TEMP、MAX、MIN)执行数学运算(例如华氏转摄氏:C = (F − 32) / 1.8)。但若直接对整个 DataFrame 或未清洗的列循环计算(如 for f in data: c = (f – 32) / 1.8),极易因以下原因报错:
DataFrame 的首行默认为列名(字符串),参与运算会触发 str – int 类型错误; 数据中存在 NaN(Pandas 中的浮点型缺失值)本可安全计算,但手动循环若未类型校验,可能引发意外异常; 某些列可能混入非数字字符串(如 “N/A”、”—”, “MISSING”),需主动过滤或转换。
✅ 正确做法是利用 Pandas 的向量化运算能力——它天然支持对 Series 或 DataFrame 子集进行元素级计算,并自动处理 NaN(结果仍为 NaN),同时完全跳过索引、列名等元数据,无需手动遍历或类型判断。
✅ 推荐方案:直接对目标列执行向量化计算
假设你的数据已加载为 Pandas DataFrame(如 data = pd.read_csv(“weather.csv”)),且 TEMP、MAX、MIN 列为数值型(含 NaN):
# 华氏 → 摄氏:向量化计算,自动忽略列名、处理 NaNdata[‘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)# 查看前5行结果(原 TEMP 和新 TEMP_C 并列)print(data[[‘TEMP’, ‘TEMP_C’, ‘MAX’, ‘MAX_C’]].head())
输出示例:
TEMP TEMP_C MAX MAX_C0 65.5 18.6 73.6 23.11 65.8 18.8 80.8 27.12 68.4 20.2 NaN NaN3 57.5 14.2 70.9 21.64 51.4 10.8 58.3 14.6
⚠️ 注意事项与进阶建议
确认数据类型:运行 data[‘TEMP’].dtype,确保为 float64 或 int64。若显示 object,说明该列混入了字符串(如 “65.5” 或 “—“),需先清洗:
data[‘TEMP’] = pd.to_numeric(data[‘TEMP’], errors=’coerce’) # 错误值转 NaN
批量处理多列(提升可维护性):
temp_cols = [‘TEMP’, ‘MAX’, ‘MIN’]for col in temp_cols: data[f'{col}_C’] = ((data[col] – 32) / 1.8).round(1)
保留原始列,避免覆盖:如上例使用 TEMP_C 新列名,而非直接赋值给 data[‘TEMP’],便于验证与回溯。
警惕隐式类型转换:若原始 CSV 中温度列为整数但含空值,Pandas 可能推断为 object 类型。务必用 pd.read_csv(…, dtype={‘TEMP’: ‘float’}) 显式指定,或使用 convert_dtypes() 统一优化。
✅ 总结
Pandas 的核心优势在于向量化、声明式计算——你只需告诉它“对 TEMP 列做这个公式”,它会自动处理全部有效数值、静默跳过元数据、并正确传播 NaN。放弃 for 循环遍历 DataFrame 行(不仅慢,且易出错),转而信任 Pandas 的内置机制,是高效、健壮数据处理的关键一步。

评论(0)