文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Pandas如何提取含有指定字符串的行

2023-07-05 05:42

关注

今天小编给大家分享一下Pandas如何提取含有指定字符串的行的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

行的提取(选择)方法

完全匹配

部分匹配

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

import pandas as pddf = 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: boolprint(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: boolprint(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     70print(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: boolprint(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: boolprint(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 0print(df_q['name'].str.contains('?', regex=False))# 0    False# 1    False# 2     True# Name: name, dtype: boolprint(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: boolprint(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: boolprint(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: boolprint(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: boolprint(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如何提取含有指定字符串的行”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯