使用str.contains通过正则检查DataFrame列数值时报错的解决方法
DataFrame检查指定列是否全为数值的实现方法
报错原因
你遇到的报错是因为Roll.No列本身是数值类型,Pandas的.str访问器仅支持字符串类型的Series调用,直接对数值列使用就会抛出AttributeError: Can only use .str accessor with string values!。
常见需求实现方式
需求1:检查整列所有值(不含NaN)均为合法数值
用pd.to_numeric实现兼容性最强,支持整数、浮点数、字符串格式数值的统一判断:
# errors='coerce' 会把无法转为数值的内容统一替换为NaN # 整体无NaN即说明全为合法数值 is_all_numeric = pd.to_numeric(df['Roll.No'], errors='coerce').notna().all()
输出为True说明列全为数值,False说明存在非数值内容。
需求2:允许列中存在NaN,仅判断非空值均为数值
# 对比转换前后的NaN分布一致,说明非空内容都可以转为数值 non_na_all_numeric = pd.to_numeric(df['Roll.No'], errors='coerce').isna().equals(df['Roll.No'].isna())
需求3:筛选出列中存在非数值的行
对应你原代码想要实现的过滤逻辑,写法如下:
# 筛选出Roll.No列为非数值的行 non_numeric_df = df[pd.to_numeric(df['Roll.No'], errors='coerce').isna()]
正则匹配实现方案
如果一定要用正则匹配做判断,需要先把目标列转为字符串类型,即可正常调用.str方法:
# 先转字符串再正则匹配非数字字符 has_non_numeric = df['Roll.No'].astype(str).str.contains(r'[^0-9]', na=True).any()
内容的提问来源于stack exchange,提问作者kristin tamas
相关产品推荐
相关产品推荐

