You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:18:35