Pandas读取CSV后负数字符串转float失败问题求助
解决Pandas中字符串列转float的特殊减号问题
你的问题核心是数据里的负号并非标准ASCII减号(U+002D),而是其他Unicode破折号/减号,同时数据中存在单独的"-"字符串(作为缺失值标记),导致转换时报错。
步骤1:排查真实字符编码
先取一个带负号的样本值,打印每个字符的Unicode编码,明确具体是哪种特殊符号:
sample = df['Verified_m'].iloc[0] for char in sample: print(f"字符: '{char}',Unicode编码: {ord(char)}")
常见的特殊减号类型:
- en-dash(短破折号):
U+2013 - em-dash(长破折号):
U+2014 - 全角减号:
U+FF0D
步骤2:针对性替换并处理缺失值
根据排查出的编码,替换为标准减号,同时将单独的"-"替换为缺失值(pd.NA),再转换为float类型:
import pandas as pd # 替换特殊减号为标准ASCII减号 df['Verified_m'] = df['Verified_m'].str.replace('\u2013', '-') # 处理en-dash df['Verified_m'] = df['Verified_m'].str.replace('\u2014', '-') # 处理em-dash df['Verified_m'] = df['Verified_m'].str.replace('\uff0d', '-') # 处理全角减号 # 将单独的"-"替换为缺失值 df['Verified_m'] = df['Verified_m'].replace('-', pd.NA) # 转换为float类型 df['Verified_m'] = df['Verified_m'].astype(float)
通用方案(匹配所有类减号字符)
如果不想逐个排查,可直接用正则匹配所有常见的Unicode减号/破折号:
import re import pandas as pd # 匹配所有类减号的Unicode字符,替换为标准减号 df['Verified_m'] = df['Verified_m'].str.replace(r'[\u2010-\u2015\uff0d]', '-', regex=True) # 处理单独的缺失值标记"-" df['Verified_m'] = df['Verified_m'].replace('-', pd.NA) # 转换为float df['Verified_m'] = df['Verified_m'].astype(float)
内容的提问来源于stack exchange,提问作者Feesh
相关产品推荐
相关产品推荐

