如何用Pandas删除含字符串单元格的行?(50万行数据清洗)
解决方案:删除目标列含字符串的整行
针对你处理50万行数据的场景,我们可以利用Pandas的pd.to_numeric()函数高效识别并过滤掉目标列中包含非数字值的行。以下是具体的修改方案:
步骤说明
- 明确目标列:根据你的示例数据,目标列是命名为
"1"的列(示例中abc出现在该列);如果实际目标列不同,替换成对应的列名即可。 - 转换并标记非数字值:用
pd.to_numeric()配合errors='coerce',把无法转为数字的单元格转为NaN,方便后续过滤。 - 过滤无效行:筛选出目标列不为
NaN的行,也就是保留纯数字的有效数据。
修改后的完整代码
import pandas as pd import csv # 读取数据(保留你的原始读取配置) mydataset = pd.read_csv( 'test.txt', error_bad_lines=False, engine='python', index_col=False, header=None, quoting=csv.QUOTE_NONE, sep="[\s|,|/]", names=["1","2","3","4","a","b","c", "h","i","j","k","l","m","n","o","p","f","g", "q","r","s","t","u","v","w","x","y","z", "5","6","7","8","9","10","11","12","13","14"] ) print(mydataset.shape) # 删除不需要的列(保留你的原始逻辑) columns =['3','4','h','a','b','c','i','j','k','l','m','n','f','g'] mydataset.drop(columns, inplace=True, axis=1) print(mydataset.shape) # 第一步:过滤非空和特定值(修正了数字列名的调用方式) mydataset = mydataset[ (mydataset.q.notnull())& (mydataset.r.notnull())& (mydataset.s.notnull())& (mydataset["2"].notnull())& (mydataset["2"] != "@") ] # 第二步:新增过滤目标列(这里以列"1"为例) # 将目标列转为数值,非数字转为NaN mydataset["1"] = pd.to_numeric(mydataset["1"], errors='coerce') # 过滤掉目标列为NaN的行(即原先是字符串的行) mydataset = mydataset[mydataset["1"].notnull()] # 可选:如果目标列都是整数,转回整数类型 mydataset["1"] = mydataset["1"].astype(int) print(mydataset.shape) # 查看过滤后的行数
关键细节解释
pd.to_numeric(errors='coerce'):这是处理大体积数据的高效方法,向量化操作比循环快得多,50万行数据完全能轻松应对。它会自动把非数字内容(比如abc)转为NaN,方便我们快速筛选。- 数字列名的调用注意:你的列名以数字开头(比如
"2"),不能用点语法mydataset.2调用,必须用方括号mydataset["2"],否则会触发语法错误,我已经在代码里修正了这个问题。 - 兼容性:这个方案完全适配Spyder环境,不需要额外安装依赖。
针对示例数据的效果
对于你给出的示例数据:
1 2 3 4 <--header abc 123 123 bcd <--Data 123 123 123 bcd <--Data
处理后会删除第一行含abc的无效数据,只保留第二行纯数字的有效行。
内容的提问来源于stack exchange,提问作者DesperatelyNeedHelp
相关产品推荐
相关产品推荐

