You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:41:07