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

如何将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到底是什么编码,避免匹配错误:

  1. 先获取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。

  1. 精准替换为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)
  1. 转换为浮点型
    替换完成后,直接转类型即可:
df['var'] = df['var'].astype(float)

小提醒

  • 有些文件里的dash可能带前后空格,这时候可以在na_values里加入' — '(带空格的版本),或者用正则r'\s*[\u2013\u2014]\s*'匹配带空格的情况。
  • 优先用pd.NA而不是np.nan,它对不同数据类型的缺失值兼容性更好,转换为浮点型后会自动变成NaN。

内容的提问来源于stack exchange,提问作者LauraF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:00:46