如何将Pandas DataFrame中的em-dash替换为NaN并保留浮点型数值?
解决Excel中Em-Dash作为缺失值替换为NaN的问题
嘿,这个问题我之前处理Excel数据时也踩过坑!Em-dash的编码变体确实容易让人头疼——不同文件里的em-dash可能是\u2014(标准em-dash)、\u2013(en-dash)甚至其他特殊编码,导致直接匹配失败。下面给你两种解决方案,优先推荐第一种,省心又高效:
最佳方案:读取Excel时直接识别缺失值
最省事的方式是在pd.read_excel阶段就告诉pandas把em-dash当作缺失值,这样后续不用额外处理,还能直接保留数值的浮点型。只需要用到na_values参数,把可能的dash变体都加进去:
import pandas as pd # 把所有可能的dash类型加入na_values列表,确保覆盖文件中的情况 df = pd.read_excel("your_data_file.xlsx", na_values=["—", "\u2014", "\u2013"])
这样pandas会自动把这些字符转换成NaN,后续你直接查看列的类型,数值列应该已经是浮点型了(如果原本是数值的话)。
如果已经读取了数据,怎么处理?
要是你已经把数据读进DataFrame了,那先得精准确认文件里的em-dash到底是什么编码,避免匹配错误:
- 先获取dash的Unicode编码
取一个包含em-dash的单元格,打印它的编码值:
# 假设你的目标列是var,先找到第一个含dash的值 sample_dash = df.loc[df['var'].str.contains('—', na=False), 'var'].iloc[0] print(f"该dash的Unicode编码: {ord(sample_dash)}")
比如输出是8212,对应就是\u2014;如果是8211就是\u2013。
- 精准替换为NaN
用replace方法直接替换,或者用正则覆盖所有类似dash:
# 方法1:直接替换已知编码的dash df['var'] = df['var'].replace(["—", "\u2014"], pd.NA) # 方法2:用正则匹配所有短/长dash import re df['var'] = df['var'].apply(lambda x: pd.NA if re.match(r'[\u2013\u2014]', str(x)) else x)
- 转换为浮点型
替换完成后,直接转类型即可:
df['var'] = df['var'].astype(float)
小提醒
- 有些文件里的dash可能带前后空格,这时候可以在
na_values里加入' — '(带空格的版本),或者用正则r'\s*[\u2013\u2014]\s*'匹配带空格的情况。 - 优先用
pd.NA而不是np.nan,它对不同数据类型的缺失值兼容性更好,转换为浮点型后会自动变成NaN。
内容的提问来源于stack exchange,提问作者LauraF
相关产品推荐
相关产品推荐

