前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pandas处理文本数据筛选

Pandas处理文本数据筛选

作者头像
皮大大
发布2023-08-23 16:28:50
1690
发布2023-08-23 16:28:50
举报

Pandas文本处理_筛选数据

本文主要介绍的是通过使用Pandas中的3个字符串相关函数来筛选满足需求的文本数据:

  • contains :包含某个字符
  • startswith:以字符开头
  • endswith:以字符结尾

模拟数据

代码语言:javascript
复制
import pandas as pd
import numpy as np
代码语言:javascript
复制
df = pd.DataFrame({
    "name":["xiao ming","Xiao zhang",np.nan,"sun quan","guan yu"],
    "age":["22","19","20","34","39"],
    "sex":["male","Female","female","Female","male"],
    "address":["广东省深圳市","浙江省杭州市","江苏省苏州市","福建省泉州市","广东省广州市"]
})

df
代码语言:javascript
复制
df.dtypes  # 查看字段类型
代码语言:javascript
复制
name       object
age        object
sex        object
address    object
dtype: object

在本次模拟的数据中,有4个特点:

  1. name字段:存在缺失值np.nan,且Xiao和xiao存在大小写之分
  2. age:年龄字段,正常应该是数值型,模拟的数据是字符类型object
  3. sex:也存在F和f的大小写之分
  4. address:正常写法

数据类型转换

我们将age字段的字符类型型转成数值型

代码语言:javascript
复制
df["age"] = df["age"].astype(float)
df

生成的数据如下,似乎和原始数据没有区别;但是我们查看属性字段的数据类型就会看到区别:

代码语言:javascript
复制
df.dtypes

name        object
age        float64    # 已经变成数值型
sex         object
address     object
dtype: object

age字段已经转成了float64位的数值型。

contains

contains是用于Series数据的函数,基本语法如下:

代码语言:javascript
复制
Series.str.contains(
    pat, 
    case=True, 
    flags=0, 
    na=None, 
    regex=True
)
  • pat:传入的字符或者正则表达式
  • case:是否区分大小写(对大小写敏感)
  • flags:正则标志位,比如:re.IGNORECASE,表示忽略大小写
  • na:可选项,标量类型;对原数据中的缺失值处理,如果是object-dtype, 使用numpy.nan 代替;如果是StringDtype, 用pandas.NA
  • regex:布尔值;True:传入的pat看做是正则表达式,False:看做是正常的字符类型的表达式

默认情况

代码语言:javascript
复制
# 例子1:筛选包含xiao的数据

df["name"].str.contains("xiao")
代码语言:javascript
复制
0     True
1    False
2      NaN
3    False
4    False
Name: name, dtype: object

当属性中存在缺失值的时候,需要带上na参数:

缺失值处理

代码语言:javascript
复制
# 例子2:参数na使用

df[df["name"].str.contains("xiao",na=False)]

如果不带上则会报错:

代码语言:javascript
复制
df[df["name"].str.contains("xiao")]

忽略大小写

代码语言:javascript
复制
# 例子3:case使用

df["name"].str.contains("xiao",case=False)
代码语言:javascript
复制
0     True
1     True
2      NaN
3    False
4    False
Name: name, dtype: object

上面的结果直接忽略了大小写,可以看到出现了两个True:也就是xiao和Xiao的数据都被筛选出来:

代码语言:javascript
复制
df[df["name"].str.contains("xiao",case=False, na=False)]

name

age

sex

address

0

xiao ming

22.0

male

广东省深圳市

1

Xiao zhang

19.0

Female

浙江省杭州市

忽略大小写和缺失值

代码语言:javascript
复制
# 例子4:忽略大小写和缺失值
df[df["sex"].str.contains("f",case=False, na=False)]

name

age

sex

address

1

Xiao zhang

19.0

Female

浙江省杭州市

2

NaN

20.0

female

江苏省苏州市

3

sun quan

34.0

Female

福建省泉州市

正则表达式使用

代码语言:javascript
复制
# 例子5:正则表达式使用

df["address"].str.contains("^广")
代码语言:javascript
复制
0     True
1    False
2    False
3    False
4     True
Name: address, dtype: bool

其中^表示开始的符号,即:以广开头的数据

代码语言:javascript
复制
df[df["address"].str.contains("^广")]

name

age

sex

address

0

xiao ming

22.0

male

广东省深圳市

4

guan yu

39.0

male

广东省广州市

正则表达式中的$表示结尾的符号;下面是筛选以结尾的数据:

代码语言:javascript
复制
df[df["address"].str.contains("市$")]

name

age

sex

address

0

xiao ming

22.0

male

广东省深圳市

1

Xiao zhang

19.0

Female

浙江省杭州市

2

NaN

20.0

female

江苏省苏州市

3

sun quan

34.0

Female

福建省泉州市

4

guan yu

39.0

male

广东省广州市

在下面的正则表达式例子中,会在深苏泉中任意选择一个,然后包含这个字符的数据:

代码语言:javascript
复制
df[df["address"].str.contains("[深苏泉]")]

name

age

sex

address

0

xiao ming

22.0

male

广东省深圳市

2

NaN

20.0

female

江苏省苏州市

3

sun quan

34.0

Female

福建省泉州市

startswith

startswith的语法相对简单:

代码语言:javascript
复制
Series.str.startswith(pat, na=None)
  • pat:表示一个字符;注意:不接受正则表达式
  • na:表示对缺失值的处理;na=False表示忽略缺失值

pat参数

指定一个字符;不接受正则表达式

代码语言:javascript
复制
df["address"].str.startswith("广")
代码语言:javascript
复制
0     True
1    False
2    False
3    False
4     True
Name: address, dtype: bool
代码语言:javascript
复制
df[df["address"].str.startswith("广")]

name

age

sex

address

0

xiao ming

22.0

male

广东省深圳市

4

guan yu

39.0

male

广东省广州市

这种写法和正则表达式的以某个字符开头是同样的效果:

代码语言:javascript
复制
df[df["address"].str.contains("^广")]

name

age

sex

address

0

xiao ming

22.0

male

广东省深圳市

4

guan yu

39.0

male

广东省广州市

自动区分大小写

startswith方法是自动区分大小写的:

代码语言:javascript
复制
df[df["sex"].str.startswith("f")]

name

age

sex

address

2

NaN

20.0

female

江苏省苏州市

代码语言:javascript
复制
df[df["sex"].str.startswith("F")]

name

age

sex

address

1

Xiao zhang

19.0

Female

浙江省杭州市

3

sun quan

34.0

Female

福建省泉州市

缺失值处理

代码语言:javascript
复制
df["name"].str.startswith("xiao")
代码语言:javascript
复制
0     True
1    False
2      NaN
3    False
4    False
Name: name, dtype: object
代码语言:javascript
复制
df[df["name"].str.startswith("xiao",na=False)]

name

age

sex

address

0

xiao ming

22.0

male

广东省深圳市

endswith

指定以某个字符结尾,语法为:

代码语言:javascript
复制
Series.str.endswith(pat, na=None)
  • pat:表示一个字符;注意:不接受正则表达式
  • na:表示对缺失值的处理;na=False表示忽略缺失值

pat参数

代码语言:javascript
复制
# 以市结尾

df[df["address"].str.endswith("市")]

name

age

sex

address

0

xiao ming

22.0

male

广东省深圳市

1

Xiao zhang

19.0

Female

浙江省杭州市

2

NaN

20.0

female

江苏省苏州市

3

sun quan

34.0

Female

福建省泉州市

4

guan yu

39.0

male

广东省广州市

代码语言:javascript
复制
# 正则的写法:contains方法

df[df["address"].str.contains("市$")]

name

age

sex

address

0

xiao ming

22.0

male

广东省深圳市

1

Xiao zhang

19.0

Female

浙江省杭州市

2

NaN

20.0

female

江苏省苏州市

3

sun quan

34.0

Female

福建省泉州市

4

guan yu

39.0

male

广东省广州市

缺失值处理

代码语言:javascript
复制
df["name"].str.endswith("g")
代码语言:javascript
复制
0     True
1     True
2      NaN
3    False
4    False
Name: name, dtype: object
代码语言:javascript
复制
df[df["name"].str.endswith("g",na=False)]

name

age

sex

address

0

xiao ming

22.0

male

广东省深圳市

1

Xiao zhang

19.0

Female

浙江省杭州市

代码语言:javascript
复制
# 不加na参数则报错
df[df["name"].str.endswith("g")]

报错的原因很明显:就是因为name字段下面存在缺失值。当使用了na参数就可以解决

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-3-5,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pandas文本处理_筛选数据
  • 模拟数据
  • 数据类型转换
  • contains
    • 默认情况
      • 缺失值处理
        • 忽略大小写
          • 忽略大小写和缺失值
            • 正则表达式使用
            • startswith
              • pat参数
                • 自动区分大小写
                  • 缺失值处理
                  • endswith
                    • pat参数
                      • 缺失值处理
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档