Pandas如何删除指定列值为纯数字的行?解决报错及边缘场景
解决Pandas删除指定列纯数字行的报错问题
问题分析
你遇到的TypeError: bad operand type for unary ~: 'float',根源是Age列混合了字符串和数值类型:调用str.contains()时,数值类型的行会返回NaN(float类型),而~操作符无法直接作用于float类型的NaN,因此触发报错。
另外原代码的正则r'\d'会匹配所有包含数字的内容,不符合你保留'4chan'这类带数字的字符串、只删除纯数字行的需求。
解决方案
先将目标列统一转为字符串类型,再用正则匹配纯数字的行(正则表达式用r'^\d+$',表示从开头到结尾全是数字),最后过滤掉这些行。
代码示例
处理初始数据
import pandas as pd # 初始数据 data = [['tom', 'Ten'], ['nick', 'Fifteen'], ['juli', 14]] df = pd.DataFrame(data, columns=['Name', 'Age']) # 1. 转字符串类型 2. 匹配纯数字行并过滤 df = df[~df['Age'].astype(str).str.match(r'^\d+$')] print(df)
输出结果:
Name Age 0 tom Ten 1 nick Fifteen
处理边缘场景数据
import pandas as pd # 边缘场景数据 data = [['tom', 'Ten'], ['nick', 'Fifteen'], ['juli', '4chan'], ['astha', 18]] df = pd.DataFrame(data, columns=['Name', 'Age']) df = df[~df['Age'].astype(str).str.match(r'^\d+$')] print(df)
输出结果:
Name Age 0 tom Ten 1 nick Fifteen 2 juli 4chan
关键说明
astype(str):把Age列所有值转为字符串,避免数值类型导致的NaN问题。str.match(r'^\d+$'):严格匹配纯数字的字符串,^表示开头,$表示结尾,\d+表示一个或多个数字,确保只有完全由数字组成的内容会被匹配。~:对布尔序列取反,保留非纯数字的行。
内容的提问来源于stack exchange,提问作者desert_ranger
相关产品推荐
相关产品推荐

