isdigit()单独可用但结合np.where处理DataFrame时失效求助
问题出在迭代对象搞错啦!
你写的any(char.isdigit() for char in df['Info'])根本不是在检查每个字符串里的字符,而是把整个Series的元素(也就是每个完整的字符串)当成了char来判断!比如它会判断'Tap'这个字符串是不是数字(显然不是)、'15k'是不是数字(也不是),最后整个any()返回的是False,所以np.where直接给所有行都填了'-'。
正确的做法有两种:
1. 用apply逐元素检查字符
通过apply遍历每个字符串里的字符,生成对应布尔数组:
import numpy as np import pandas as pd df = pd.DataFrame({'Info': ['Tap', '15k', 'rot', '12psi']}) # 生成每个元素是否含数字的布尔序列 has_digit = df['Info'].apply(lambda s: any(c.isdigit() for c in s)) df['num'] = np.where(has_digit, df['Info'], '-')
2. 用正则表达式更高效
Pandas的str.contains可以直接用正则\d匹配数字,代码更简洁,大数据下性能也更好:
df['num'] = np.where(df['Info'].str.contains(r'\d'), df['Info'], '-')
两种方法运行后,你的DataFrame都会得到正确结果:
Info num 0 Tap - 1 15k 15k 2 rot - 3 12psi 12psi
内容的提问来源于stack exchange,提问作者moys
相关产品推荐
相关产品推荐

