如何在Pandas DataFrame中识别并删除含不良数据的行
解决方法
针对你的需求,我们可以通过矢量化操作高效识别并删除包含字符串格式浮点数值的行,避免逐行循环带来的性能问题(适配50k行的大型数据集)。
方案1:利用pd.to_numeric自动识别数值格式
这个方法无需手动编写正则,能自动匹配所有合法的数值格式(包括整数、浮点数、科学计数法等),适合只要是数值形式的字符串都视为不良数据的场景:
import pandas as pd # 创建示例DataFrame df = pd.DataFrame({ 'name': ['12 x st', '0.5555', 'y'], 'val': [1, 0.5555, 2], 'col': ['t', 'u', '0.5555'], 'z': [2500, 2000, 1800] }) # 指定需要检查的列(比如name、col) check_columns = ['name', 'col'] # 生成掩码:标记任何指定列中可转换为数值的行 # pd.to_numeric转换失败返回NaN,notna()筛选出能成功转换的(即不良数据行) bad_rows_mask = df[check_columns].apply( lambda col: pd.to_numeric(col, errors='coerce').notna() ).any(axis=1) # 过滤掉不良行,得到清理后的DataFrame clean_df = df[~bad_rows_mask]
执行后clean_df的结果:
name val col z 0 12 x st 1 t 2500
方案2:正则表达式精确匹配浮点格式
如果你需要只匹配带小数点的浮点数(排除纯整数形式的字符串),可以用正则表达式精确控制匹配规则:
import pandas as pd import re # 定义仅匹配带小数点的浮点数的正则(可根据需求调整) float_regex = re.compile(r'^[-+]?\d+\.\d+$') # 创建示例DataFrame df = pd.DataFrame({ 'name': ['12 x st', '0.5555', 'y'], 'val': [1, 0.5555, 2], 'col': ['t', 'u', '0.5555'], 'z': [2500, 2000, 1800] }) check_columns = ['name', 'col'] # 生成掩码:标记指定列中匹配浮点格式的行 bad_rows_mask = df[check_columns].apply( lambda col: col.str.match(float_regex, na=False) ).any(axis=1) clean_df = df[~bad_rows_mask]
关键说明
- 矢量化操作:两种方案都使用Pandas的矢量化方法(
apply结合pd.to_numeric/str.match),处理50k行数据的速度远快于逐行循环。 - 列选择:
check_columns可根据实际需要添加或删除要检查的列。 - 缺失值处理:方案1中
errors='coerce'会将无法转换的字符串转为NaN;方案2中na=False会将缺失值视为非不良数据,可根据需求调整。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

