如何检查pandas Series值是否包含任意数字字符并替换无数字值为NaN
解决方案
直接使用正则匹配逐元素判断是否包含数字即可,该方案天然支持重复索引场景,不需要单独处理重复索引对应的子Series:
完整实现代码
import pandas as pd # 注意原示例用字典构造重复索引会导致前一个c的value被覆盖,这里用正确的方式构造目标Series ser = pd.Series(data=["Python", "$|", "|32", "dos"], index=['a', 'b', 'c', 'c']) # 核心逻辑:只要字符串包含任意数字就保留,否则替换为NaN ser = ser.where(ser.str.contains(r'\d', na=False), pd.NA)
运行结果
执行后ser的输出为:
a <NA> b <NA> c |32 c <NA> dtype: object
原理说明
Series.str.contains(r'\d')会逐元素扫描字符串,只要存在任意数字字符就返回True,刚好替代isnumeric只能判断全数字的不足,且该操作是逐元素执行的,和索引是否重复无关,重复索引下的每个值都会单独判断。where方法会保留条件为True位置的原值,条件为False的位置统一替换为指定的pd.NA(即NaN)。- 参数
na=False是为了兼容序列中本身存在空值的场景,空值会被判定为不包含数字,统一替换为NaN。
内容的提问来源于stack exchange,提问作者xxgaryxx
相关产品推荐
相关产品推荐

