CDA数据分析师 出品  

作者:  张彦存

编译: Mika

Pandas中字符串的操作是相当的灵活,内置了大量的相关方法用于字符串的加工处理,并且许多方法都是支持正则表达式的。

筛选包含特定字符串的列可以根据特定字符串在列名中的位置有这么几种情形:

  • 这个特定字符串在列名首

  • 这个特定字符串在列名尾

  • 这个特定字符串在列名中

  • 这个特定字符串在列名的任意位置上

筛选特定的列数据基本有两种思路:

  • 使用pandas字符串方法+布尔索引

  • 使用pandas提供的filter进行筛选

使用pandas字符串方法+布尔索引

为处理字符串数据,Pandas通过.str提供了许多字符串处理方法:

  • contains 判断某字符串中是否包含

  • startswith

  • endswith

这些方法均返回布尔值的序列,可用于布尔索引。

import pandas as pd
data = pd.DataFrame({'A1':[1,2,3],'B1':[1,2,3],"1B11":[4,5,6],"11B":[4,3,7]})
data
A1 B1 1B11 11B
0 1 1 4 4
1 2 2 5 3
2 3 3 6 7

这个特定字符串在列名的任意位置上

例如筛选列名中包含B的列,这时只需给contains传入字符串'B'即可得到布尔数组

data.columns.str.contains('B')
array([False,  True,  True,  True])

使用上述布尔数组作为索引,筛选符合要求的列

data.loc[:,data.columns.str.contains('B')]
B1 1B11 11B
0 1 4 4
1 2 5 3
2 3 6 7

如果特定字符并不是某一具体的字符串,而是某一类的字符串,比如包含两个连续数字或其他特征,这时候也可以结合正则表达式来实现筛选。

data.columns.str.contains('\d{2}',regex=True)
array([False, False,  True,  True])

regex=True 表示正在使用正则表达式 \d{2} 表示两个数字构成的字符串,使用上述代码得到相应的布尔数组,进行布尔索引即可。

data.loc[:,data.columns.str.contains('\d{2}',regex=True)]
1B11 11B
0 4 4
1 5 3
2 6 7

1B11 11B中均包含两个连续的数字,因此符合条件

这个特定字符在字符串的开头

比如要求这特定的字符必须在字符串的开头,可以使用startswith

data.columns.str.startswith("B")
array([False,  True, False, False])

上述代码筛选以B开头的列

data.loc[:,data.columns.str.startswith("B")]
B1
0 1
1 2
2 3

这样就筛选出了符合条件的列。如果不是固定的字符,而是某一类字符,那么这时候需要使用contains+正则表达式的组合,startswith不支持正则表达式。

data.columns.str.contains("^\d{2}",regex=True)
array([False, False, False,  True])

正则表达式"^\d{2}"表示以两个数字开头的字符串

data.loc[:,data.columns.str.contains("^\d{2}",regex=True)]
11B
0 4
1 3
2 7

这个特定字符在字符串的尾部

比如要求这特定的字符必须在字符串的尾部,可以使用endswith

data.columns.str.endswith("B")
array([False, False, False,  True])

上述代码筛选以B结尾的列,得到相应的布尔数组,使用布尔数组筛选数据,代码如下:

data.loc[:,data.columns.str.endswith("B")]
11B
0 4
1 3
2 7

这样就筛选出了符合条件的列。如果不是固定的字符,而是某一类字符,那么这时候需要使用contains+正则表达式的组合,endswith不支持正则表达式。

data.columns.str.contains("\d{2}$",regex=True)
array([False, False,  True, False])

正则表达式"\d{2}$"表示以两个数字结尾的字符串

data.loc[:,data.columns.str.contains("\d{2}$",regex=True)]
1B11
0 4
1 5
2 6

这个特定字符串在字符串的中部

这种需求需要使用正则表达式来去实现

data.columns.str.contains("^[^B]+B[^B]+$",regex=True)
array([False, False,  True, False])

正则表达式"^[^B]+B[^B]+$"表示以非B字符开头、结尾且包含B的列名

data.loc[:,data.columns.str.contains("^[^B]+B[^B]+$",regex=True)]
1B11
0 4
1 5
2 6

当然在进行字符串处理的过程中除了使用字符串特定函数之外还可以使用map apply 再结合自定义函数实现更复杂的处理

使用pandas提供的filter进行筛选

Pandas 的 filter 方法根据指定的索引标签对数据框行或列查询子集。
DataFrame 使用时的语法为:

df.filter(items=None,like: 'str | None' = None,regex: 'str | None' = None,axis=None,
) -> 'FrameOrSeries'

参数:

  • items:list-like,对应轴的标签名列表

  • like:str,支持对应标签名的模糊名查询

  • regex:str (正则表达式),按正则表达式查询标签名

  • axis:{0 or ‘index’, 1 or ‘columns’, None}, default None,要筛选的轴,表示为索引(int)或轴名称(str)。默认情况下为列名,‘index’ 为 Series, ‘columns’ 为 DataFrame

返回:

与输入对象类型相同

需要注意的是,此方法不会对数据帧的数据内容进行过滤,仅应用于按标签筛选。

其中的参数 items, like, 和 regex parameters 被强制执行为相互排斥,即只能有一个存在。

筛选列名中间包括B的可以直接使用正则表达式筛选,代码如下:

data.filter(regex="^[^B]+B[^B]+$",axis=1)
1B11
0 4
1 5
2 6

筛选列名以两个数字结尾的列,代码如下:

data.filter(regex="\d{2}$",axis=1)
1B11
0 4
1 5
2 6

实战 | Pandas如何筛选出包含特定字符串的列相关推荐

  1. pandas筛选dataframe列名称中包含特定字符串的数据列(select columns contains specifiec substring in dataframe)

    pandas筛选dataframe列名称中包含特定字符串的数据列(select columns contains specifiec substring in dataframe) 目录 pandas ...

  2. pandas删除dataframe列名称中包含特定字符串的数据列(dropping columns contains specifiec substring in dataframe)

    pandas删除dataframe列名称中包含特定字符串的数据列(dropping columns contains specifiec substring in dataframe) 目录 pand ...

  3. pandas删除包含特定字符串所在的行

    文章目录 构建df df结构 删除包含特定字符串所在的行 效果 代码汇总 构建df import pandas as pddf = pd.DataFrame({'水果': ['苹果', '香蕉', ' ...

  4. 如何在JavaScript / jQuery中查找数组是否包含特定字符串? [重复]

    本文翻译自:How to find if an array contains a specific string in JavaScript/jQuery? [duplicate] This ques ...

  5. pandas使用query函数基于dataframe字符串数据列中字符串的长度筛选dataframe的数据行(specific column string length)

    pandas使用query函数基于dataframe字符串数据列中字符串的长度筛选dataframe的数据行(select dataframe rows based on specific colum ...

  6. 正则表达式匹配不包含特定字符串解决匹配溢出问题

    匹配溢出问题在正则表达式当中算是比较常见的问题,它常常导致我们匹配结果莫名其妙的出错,本文专门为你讲解如何通过匹配不包含特定字符串的方法来解决这类问题. 那么,什么是匹配溢出呢? 下面我们来看个例子: ...

  7. vim多行注释, 多行删除, 删除所有内容, 删除包含特定字符串的行

    1.多行注释: 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式; 在行首使用上下键选择需要注释的多行; 按下键盘(大写)"I"键,进入插入模式: 然后输 ...

  8. pandas基于dataframe字符串数据列不包含特定字符串来筛选dataframe中的数据行(rows where values do not contain substring)

    pandas基于dataframe字符串数据列不包含(not contains)特定字符串来筛选dataframe中的数据行(rows where values do not contain subs ...

  9. (20210129已解决)Pandas通过某列值包含特定字符串过滤行

    Overview Maybe expressed with english by: how to filter rows containing a string pattern from a Pand ...

最新文章

  1. 微软职位内部推荐-SDEII
  2. jQuery 操作大全
  3. 5行代码满分——L1-060 心理阴影面积 (5分)
  4. 【POI xls Java map】使用POI处理xls 抽取出异常信息 --java1.8Group by ---map迭代 -- 设置单元格高度...
  5. 背包问题的二进制优化
  6. UVa 10635 (LIS+二分) Prince and Princess
  7. mysql5.5删除干净_MySql5.5 安装及卸载
  8. shell给python传变量_python和shell 传递变量
  9. android欢迎界面的功能,Android 启动 ( 欢迎 ) 页面实现
  10. bootstrap有哪些常用组件
  11. xp系统整个计算机非常慢,xp系统电脑运行慢太卡了怎么办|xp系统运行卡顿的解决方法...
  12. 【练习/Python】监测汇率脚本
  13. linux代码之spin lock
  14. 赵小楼《天道》《遥远的救世主》深度解析(111)人是需要社会认同感和存在感的
  15. org.jasypt.exceptions.EncryptionOperationNotPossibleException: null
  16. 代理模式(静态代理和动态代理)
  17. GitHub下载加速网站
  18. %20ld c语言,C语言第二次实验报告 - osc_ldea7g3t的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. SEO优化要以“大局为重”
  20. 随意细解:UI -- 初级数据持久化

热门文章

  1. VSCode 是什么
  2. CDN使用心得:加速双刃剑
  3. 单例模式的两种实现方式:恶汉式和懒汉式
  4. 怎么用服务器网络中转,怎么假设中转服务器
  5. CUDA与OpenGL交互开发
  6. ZZULIOJ1039
  7. Java小游戏——五子棋(简易版)
  8. 抽象工厂模式(图画版)
  9. 在JavaScript中实现承诺
  10. 读书千遍,其义自见 古人诚不欺我