如何替换pandas DataFrame列中带°的字符串并转换为float类型
pandas经纬度列清洗(去除°符号转浮点)解决方案
报错根因
- 报错1:
ValueError: Cannot mask with non-boolean array containing NA / NaN values error。Series.str.contains()默认对NaN/None空值返回NaN而非布尔值,带非布尔值的数组无法作为筛选掩码。 - 报错2:
ValueError: operands could not be broadcast together。两点问题:一是未给str.contains传空值处理参数,条件数组存在NaN;二是df['Lat'][:-1]是整列行切片(丢弃最后一行),不是对单个元素去尾,np.where三个入参数组维度不匹配,无法广播。
正确实现方案
推荐使用鲁棒性更强的向量化实现,无需逐行循环,兼容正常浮点值、带°的字符串、空值三种场景:
import pandas as pd import numpy as np # 核心清洗代码:对Lat、Long两列统一处理 for col in ['Lat', 'Long']: # 1. 统一转字符串 2. 移除所有°符号 3. 转浮点类型,转换失败的值(空值等)设为NaN df[col] = pd.to_numeric( df[col].astype(str).str.replace('°', '', regex=False), errors='coerce' )
原有写法修正(仅作参考,不推荐)
如果要沿用str.contains+np.where的逻辑,需要补全空值处理参数,且对字符串做元素级切片:
# na=False表示空值统一判定为不匹配,解决掩码含NaN的问题 mask = df['Lat'].str.contains('°', na=False) # .str[:-1]是对每个字符串元素做去尾切片,而非整列行切片 df['Lat'] = np.where(mask, df['Lat'].str[:-1], df['Lat']) # 最后统一转浮点 df['Lat'] = pd.to_numeric(df['Lat'], errors='coerce')
该写法需要对每列单独写逻辑,且遇到非字符串类型的正常值时容易触发属性错误,优先使用前面的通用向量化方案。
清洗效果
执行完代码后两列数据类型均为float64:
- 原本正常的浮点值保持不变
- 末尾带°的字符串移除符号后正确转为浮点
- 原空值保留为
NaN,无数据丢失
内容的提问来源于stack exchange,提问作者Alex Fidalgo
相关产品推荐
相关产品推荐

