pandas替换数据集\N值为math.nan触发re.error报错原因咨询
数据集样例
数据集字段结构及样例数据如下:
| tconst | ordering | nconst | category | job | Characters |
|---|---|---|---|---|---|
| tt0069049 | 10.0 | nm0613657 | editor | \N | \N |
| tt0069049 | 1.0 | nm0001379 | actor | \N |
问题描述
已通过pandas加载上述CSV格式数据集,需要将数据集中所有值为\N的条目替换为math.nan,初始实现代码如下:
import math import pandas as pd cast_data = pd.read_csv("cast.csv") cast_data.replace(cast_data.replace(r"^\N*$", math.nan, regex=True))
运行代码后抛出如下正则错误:
re.error: missing { at position 3
报错原因
报错由两个问题共同导致:
- 正则转义错误:Python正则语法中,
\N是用于匹配Unicode命名字符的特殊标记,要求必须配合{Unicode字符名}的格式使用(例如\N{EM DASH}匹配长破折号)。代码中直接写\N没有跟随{,正则引擎解析到该位置时直接抛出missing {的错误,需要对反斜杠做转义才能匹配字面量的\N字符串。另外原正则写的\N*会匹配0到多个N,会误匹配空字符串,不符合精确替换\N的需求。 - replace调用逻辑错误:代码嵌套调用了两次
replace,外层replace将内层replace的返回结果(一个DataFrame对象)作为替换映射传入,完全不符合pandas.DataFrame.replace的参数要求,即使正则不报错也无法得到预期结果。
正确实现方案
两种常用实现方式可按需选择:
- 方式1:读取CSV时直接指定空值标记,运行效率最高
import math import pandas as pd # 读取时直接将\N识别为NaN,无需后续额外替换,pandas默认NaN与math.nan完全等价 cast_data = pd.read_csv("cast.csv", na_values=r"\N")
- 方式2:数据加载完成后做替换,修正正则与调用逻辑
import math import pandas as pd cast_data = pd.read_csv("cast.csv") # 双反斜杠转义匹配字面量\N,直接接收replace返回值赋值给原变量 cast_data = cast_data.replace(r"^\\N$", math.nan, regex=True)
如果需要匹配样例中
\N|这类带后缀的脏\N值,可以将正则调整为r"^\\N.*"即可。
内容的提问来源于stack exchange,提问作者blacklion
相关产品推荐
相关产品推荐

