0

0

Pandas教程:高效删除包含特定子字符串的行,解决大小写敏感问题

霞舞

霞舞

发布时间:2025-11-22 14:06:06

|

468人浏览过

|

来源于php中文网

原创

Pandas教程:高效删除包含特定子字符串的行,解决大小写敏感问题

本教程详细讲解了如何使用pandas在dataframe中删除某一列包含特定部分字符串的行。重点介绍了`str.contains()`方法的应用,特别是如何通过设置`case=false`参数来处理大小写不敏感的匹配,以及利用`na=false`处理缺失值,确保数据清洗的准确性和效率,并提供了完整的代码示例。

引言:数据清洗中删除特定行

在数据分析和预处理过程中,我们经常需要根据某一列的内容来过滤或删除行。当需要删除的条件是某一列包含特定的“部分字符串”时,Pandas提供了强大的字符串处理能力来完成这项任务。然而,如果不了解其细节,可能会遇到匹配不成功的问题,尤其是在涉及大小写敏感性和缺失值处理时。

Pandas str.contains() 方法详解

Pandas的Series.str.contains()方法是处理这类问题的核心工具。它用于检查Series中的每个字符串是否包含指定的模式(子字符串或正则表达式),并返回一个布尔Series。结合布尔索引和逻辑非运算符,我们可以轻松地筛选出不包含特定子字符串的行。

1. 基本用法

str.contains(pat, case=True, flags=0, na=nan, regex=True)

  • pat: 要查找的模式,可以是字符串或正则表达式。
  • case: 布尔值,默认为True。如果为True,则执行大小写敏感匹配;如果为False,则执行大小写不敏感匹配。
  • na: 用于替换NaN值的填充值。默认为NaN。如果设置为False,则NaN值将被视为不包含模式。
  • regex: 布尔值,默认为True。如果为True,则将pat视为正则表达式;如果为False,则将其视为字面字符串。

2. 解决大小写敏感问题

在实际应用中,数据中的字符串可能存在大小写不一致的情况(例如,"NQR"、"nqr"、"Nqr")。如果默认使用case=True(即大小写敏感),那么只匹配与给定模式大小写完全一致的字符串。这是许多用户在尝试删除行时遇到的常见问题

要解决这个问题,只需将case参数明确设置为False,即可实现大小写不敏感的匹配。

Convai Technologies Inc.
Convai Technologies Inc.

对话式 AI API,用于设计游戏和支持端到端的语音交互

下载

3. 处理缺失值(NaN)

数据集中经常存在缺失值(NaN)。str.contains()方法默认对NaN值返回NaN。当我们将这个布尔Series用于筛选时,NaN值不会被视为True或False,可能导致意外的行为。为了确保NaN值不被视为包含特定字符串,并能正确地被过滤,应将na参数设置为False。

示例:删除包含特定子字符串的行

假设我们有一个DataFrame,其中包含一个名为Title的列,我们希望删除所有Title列中包含“NQR”(不区分大小写)的行。

import pandas as pd
import numpy as np

# 创建一个示例DataFrame
data = {
    'ID': [1, 2, 3, 4, 5, 6, 7],
    'Title': ['Product A (NQR)', 'Product B', 'Service C (nqr report)', 'Product D', 'Item E (NQR TEST)', 'Product F (no qual request)', None],
    'Price': [100, 200, 150, 50, 300, 250, 120]
}
df = pd.DataFrame(data)

print("原始 DataFrame:")
print(df)
print("-" * 30)

# 目标:删除 'Title' 列中包含 'NQR' (不区分大小写) 的行

# 错误的尝试(可能因大小写敏感或未处理NaN而失败)
# df_attempt1 = df[~df['Title'].str.contains('NQR', na=False)]
# print("\n尝试1 (默认大小写敏感):")
# print(df_attempt1)
# 此时 'Service C (nqr report)' 和 'Product F (no qual request)' 仍会保留

# 正确的解决方案:使用 case=False 进行大小写不敏感匹配,并处理NaN
# 1. df['Title'].str.contains('NQR', na=False, case=False)
#    - 'NQR': 要查找的子字符串
#    - na=False: 将 NaN 值视为不包含 'NQR'
#    - case=False: 忽略大小写进行匹配
#    这会返回一个布尔Series,其中包含 'NQR' 的行为 True,不包含的为 False。

# 2. ~ (逻辑非运算符)
#    - 将上述布尔Series反转,这样包含 'NQR' 的行为 False,不包含的为 True。
#    - 我们希望保留不包含 'NQR' 的行,所以需要反转。

# 3. df[...] (布尔索引)
#    - 使用反转后的布尔Series作为索引来选择DataFrame中的行。

# 4. .reset_index(drop=True)
#    - 在删除行后,DataFrame的索引可能会变得不连续。
#    - reset_index() 会重置索引,并默认将旧索引添加为新列。
#    - drop=True 参数可以防止旧索引被添加为新列,直接生成一个从0开始的新索引。

df_cleaned = df[~df['Title'].str.contains('NQR', na=False, case=False)].reset_index(drop=True)

print("\n清洗后的 DataFrame (删除包含 'NQR' 的行,不区分大小写):")
print(df_cleaned)

代码解释:

  • df['Title'].str.contains('NQR', na=False, case=False):这行代码会生成一个布尔Series。对于Title列中的每个字符串:
    • 如果包含“NQR”(不区分大小写),则为True。
    • 如果不包含“NQR”,则为False。
    • 如果为None(NaN),则因为na=False而被视为False。
  • ~:这是一个逻辑非运算符。它将上述布尔Series中的True变为False,False变为True。这样,我们就可以选中那些包含“NQR”的行。
  • df[...]:使用布尔Series作为索引来过滤DataFrame,只保留布尔Series中对应值为True的行。
  • .reset_index(drop=True):在删除行后,DataFrame的索引可能不再是连续的。reset_index()方法可以重置索引,drop=True参数则确保旧的索引列不会被添加到新的DataFrame中。

注意事项与最佳实践

  1. 大小写敏感性 (case): 始终明确考虑你的匹配是否需要区分大小写。在大多数数据清洗场景中,为了捕获所有相关数据,通常会使用case=False。
  2. 缺失值处理 (na): 同样,明确处理缺失值非常重要。na=False是一个安全的默认设置,它将NaN值视为不匹配,避免它们在过滤过程中产生意外行为。
  3. 正则表达式 (regex): str.contains()默认支持正则表达式。如果你的模式不仅仅是简单的子字符串,而是更复杂的匹配规则(例如,匹配以特定字符开头或结尾的字符串,或多个模式中的任意一个),你可以利用正则表达式的强大功能。例如,要删除包含“NQR”或“XYZ”的行,可以使用'NQR|XYZ'作为模式。
  4. 链式操作: 在Pandas中,链式操作可以使代码更简洁。将reset_index()直接链接在筛选操作之后是一种常见的做法。
  5. 性能: 对于非常大的DataFrame,str.contains()可能不是最快的字符串匹配方法,但对于常规的数据集,其性能通常足够。

总结

通过本教程,我们学习了如何利用Pandas的str.contains()方法高效且准确地删除DataFrame中某一列包含特定部分字符串的行。关键在于理解并正确使用case=False来忽略大小写,以及na=False来恰当处理缺失值。结合逻辑非运算符~和reset_index(drop=True),我们可以构建出健壮的数据清洗流程,确保数据质量和分析的准确性。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

248

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

738

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

211

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

350

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

232

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

528

2023.12.06

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
AngularJS教程
AngularJS教程

共24课时 | 2.6万人学习

【李炎恢】ThinkPHP8.x 后端框架课程
【李炎恢】ThinkPHP8.x 后端框架课程

共50课时 | 4.4万人学习

Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号