Pandas提取含有指定字符串的行(完全匹配,部分匹配)

 更新时间:2023年02月22日 10:33:12   作者:饺子大人  
本文主要介绍了Pandas提取含有指定字符串的行(完全匹配,部分匹配),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

以下内容,如何使用pandas提取含有指定字符串的行的方法进行解释说明。

行的提取(选择)方法

完全匹配

  • ==

部分匹配

  • str.contains():包含一个特定的字符串
    • 参数na:缺少值NaN处理
    • 参数case:大小写我的处理
    • 参数regex:使用正则表达式模式
  • str.endswith():以特定字符串结尾
  • str.startswith():以特定的字符串开头
  • str.match():匹配正则表达式模式

要提取部分匹配的行,可以使用pandas的(str.xxx())方法,根据指定条件提取的字符串方法。
这次以以下数据为例

import pandas as pd

df = pd.read_csv('./data/08/sample_pandas_normal.csv').head(3)
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70

行的提取(选择)方法

首先,展示如何从pandas.DataFrame中提取(选择)行以获得新的pandas.DataFrame。

使用布尔值的布尔列表(数组)或pandas.Series的话,只能提取(选择)True行。

mask = [True, False, True]
df_mask = df[mask]
print(df_mask)
#       name  age state  point
# 0    Alice   24    NY     64
# 2  Charlie   18    CA     70

因此,对于具有字符串元素的列,是否能够获得根据条件的布尔列表就足够了。

完全匹配

==

如果元素与字符串完全匹配,则使用==获取为True的pandas.Series。

print(df['state'] == 'CA')
# 0    False
# 1     True
# 2     True
# Name: state, dtype: bool

print(df[df['state'] == 'CA'])
#       name  age state  point
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70

部分匹配

str.contains():包含一个特定的字符串

pandas.Series字符串方法str.contains()允许获取包含特定字符串的pandas.Series.

print(df['name'].str.contains('li'))
# 0     True
# 1    False
# 2     True
# Name: name, dtype: bool

print(df[df['name'].str.contains('li')])
#       name  age state  point
# 0    Alice   24    NY     64
# 2  Charlie   18    CA     70

请注意,默认情况下,第一个参数中指定的字符串将作为正则表达式模式进行处理,如下所述。

参数na:缺少值NaN处理

如果元素是缺失值NaN,则默认情况下它将返回NaN而不是True或False。因此,使用pandas.Series提取该行是错误的。

df_nan = df.copy()
df_nan.iloc[2, 0] = float('nan')
print(df_nan)
#     name  age state  point
# 0  Alice   24    NY     64
# 1    Bob   42    CA     92
# 2    NaN   18    CA     70

print(df_nan['name'].str.contains('li'))
# 0     True
# 1    False
# 2      NaN
# Name: name, dtype: object

# print(df_nan[df_nan['name'].str.contains('li')])
# ValueError: cannot index with vector containing NA / NaN values

可以通过str.contains()的参数na来指定替换NaN结果的值。

print(df_nan['name'].str.contains('li', na=False))
# 0     True
# 1    False
# 2    False
# Name: name, dtype: bool

print(df_nan['name'].str.contains('li', na=True))
# 0     True
# 1    False
# 2     True
# Name: name, dtype: bool

用作条件时,如果na = True,则选择NaN的行,如果na = False,则不选择NaN的行。

参数case:大小写我的处理

默认情况下,区分大小写。如果参数case为False,则case被忽略。

print(df['name'].str.contains('LI'))
# 0    False
# 1    False
# 2    False
# Name: name, dtype: bool

print(df['name'].str.contains('LI', case=False))
# 0     True
# 1    False
# 2     True
# Name: name, dtype: bool

参数regex:使用正则表达式模式

使用str.contains()时要记住的一件事是,默认情况下,指定为第一个参数的字符串将作为正则表达式模式进行处理。

print(df['name'].str.contains('i.*e'))
# 0     True
# 1    False
# 2     True
# Name: name, dtype: bool

如果参数ragex为False,则确定是否包含第一个参数的字符串本身。

print(df['name'].str.contains('i.*e', regex=False))
# 0    False
# 1    False
# 2    False
# Name: name, dtype: bool

例如,如果要判断是否包含正则表达式的特殊字符,例如?,。,*,则需要设置regex = False。当然,可以指定一个正则表达式模式,以转义\?等特殊字符。

请注意,默认值可能会导致错误。

df_q = df.copy()
df_q.iloc[2, 0] += '?'
print(df_q)
#        name  age state  point
# 0     Alice   24    NY     64
# 1       Bob   42    CA     92
# 2  Charlie?   18    CA     70

# print(df_q['name'].str.contains('?'))
# error: nothing to repeat at position 0

print(df_q['name'].str.contains('?', regex=False))
# 0    False
# 1    False
# 2     True
# Name: name, dtype: bool

print(df_q['name'].str.contains('\?'))
# 0    False
# 1    False
# 2     True
# Name: name, dtype: bool

str.contains()等同于re.search(),并且可以在flags参数中指定正则表达式标志。如稍后所述,还有对应于re.match()的str.match()。

请注意,下面要介绍的str.endswith()如果想要确定end ?,会更容易,如本例所示。

str.endswith():以特定字符串结尾

pandas.Series字符串方法str.endswith()可以获取以特定字符串结尾的pandas.Series。

print(df['name'].str.endswith('e'))
# 0     True
# 1    False
# 2     True
# Name: name, dtype: bool

print(df[df['name'].str.endswith('e')])
#       name  age state  point
# 0    Alice   24    NY     64
# 2  Charlie   18    CA     70

str.endswith()也有一个参数na。如果要选择缺失值NaN的行,则设置na = True;如果不想选择,则将na = False设置。

没有参数case,因此它始终区分大小写。

另外,第一个参数的字符串在确定中照原样使用,而不作为正则表达式模式处理。

str.startswith():以特定的字符串开头

pandas.Series字符串方法str.startswith()可以获取以特定字符串开头的pandas.Series。

print(df['name'].str.startswith('B'))
# 0    False
# 1     True
# 2    False
# Name: name, dtype: bool

print(df[df['name'].str.startswith('B')])
#   name  age state  point
# 1  Bob   42    CA     92

str.match():匹配正则表达式模式

pandas.Series字符串方法str.match()可以获取与正则表达式模式匹配的pandas.Series。

print(df['name'].str.match('.*i.*e'))
# 0     True
# 1    False
# 2     True
# Name: name, dtype: bool

print(df[df['name'].str.match('.*i.*e')])
#       name  age state  point
# 0    Alice   24    NY     64
# 2  Charlie   18    CA     70

如上所述,str.match()对应于re.match(),并确定字符串的开头是否与模式匹配。如果不是一开始就为False。

print(df['name'].str.match('.*i'))
# 0     True
# 1    False
# 2     True
# Name: name, dtype: bool

print(df['name'].str.match('i.*e'))
# 0    False
# 1    False
# 2    False
# Name: name, dtype: bool

当需要确定是否包括与模式匹配的部分时,不仅在开始时,而且默认使用与上述re.search()等效的re.contains()(regex = True)。

str.match()与str.contains()可以以相同的方式指定参数na,case和flag。

到此这篇关于Pandas提取含有指定字符串的行(完全匹配,部分匹配)的文章就介绍到这了,更多相关Pandas提取指定字符串的行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python3处理HTTP请求的实例

    Python3处理HTTP请求的实例

    今天小编就为大家分享一篇Python3处理HTTP请求的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 在Python中处理时间之clock()方法的使用

    在Python中处理时间之clock()方法的使用

    这篇文章主要介绍了在Python中处理时间之clock()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • pycharm 终端部启用虚拟环境详情

    pycharm 终端部启用虚拟环境详情

    这篇文章主要介绍了pycharm 终端部启用虚拟环境详情,文章围绕pycharm 终端部启用虚拟环境商务相关资料展开全文章的详细内容,需要的小伙伴可以参考一下
    2021-12-12
  • python Shapely使用指南详解

    python Shapely使用指南详解

    这篇文章主要介绍了python Shapely使用指南详解,需要的朋友可以参考下
    2020-02-02
  • python定时利用QQ邮件发送天气预报的实例

    python定时利用QQ邮件发送天气预报的实例

    下面小编就为大家分享一篇python定时利用QQ邮件发送天气预报的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • 解决pycharm启动后总是不停的updating indices...indexing的问题

    解决pycharm启动后总是不停的updating indices...indexing的问题

    今天小编就为大家分享一篇解决pycharm启动后总是不停的updating indices...indexing的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python中else的三种使用场景

    Python中else的三种使用场景

    在Python中else最常见的用法就是用在判断语句中,其实还可以用在循环语句和异常处理中。 下面来总结一下else的用法:
    2021-06-06
  • OpenCV利用python来实现图像的直方图均衡化

    OpenCV利用python来实现图像的直方图均衡化

    这篇文章主要介绍了OpenCV利用python来实现图像的直方图均衡化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Python网络爬虫神器PyQuery的基本使用教程

    Python网络爬虫神器PyQuery的基本使用教程

    这篇文章主要给大家介绍了关于Python网络爬虫神器PyQuery的基本使用教程,文中通过示例代码介绍的非常详细,对大家学习使用PyQuery具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-02-02
  • TensorFlow的环境配置与安装方法

    TensorFlow的环境配置与安装方法

    这篇文章主要介绍了TensorFlow的环境配置与安装方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02

最新评论