查看原文
其他

Pandas筛选文本数据3部曲

尤而小屋 尤而小屋 2022-06-19

公众号:尤而小屋
作者:Peter
编辑:Peter

大家好,我是Peter~

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

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

模拟数据

import pandas as pd
import numpy as np
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
df.dtypes  # 查看字段类型
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字段的字符类型型转成数值型

df["age"] = df["age"].astype(float)
df

nameagesexaddress
0xiao ming22.0male广东省深圳市

如果不带上则会报错:

df[df["name"].str.contains("xiao")]

忽略大小写

# 例子3:case使用

df["name"].str.contains("xiao",case=False)
0 True
1 True
2 NaN
3 False
4 False
Name: name, dtype: object

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

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

nameagesexaddress
0xiao ming22.0male广东省深圳市
1Xiao zhang19.0Female浙江省杭州市

忽略大小写和缺失值

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

nameagesexaddress
1Xiao zhang19.0Female浙江省杭州市
2NaN20.0female江苏省苏州市
3sun quan34.0Female福建省泉州市

正则表达式使用

# 例子5:正则表达式使用

df["address"].str.contains("^广")
0 True
1 False
2 False
3 False
4 True
Name: address, dtype: bool

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

df[df["address"].str.contains("^广")]

nameagesexaddress
0xiao ming22.0male广东省深圳市
4guan yu39.0male广东省广州市

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

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

nameagesexaddress
0xiao ming22.0male广东省深圳市
1Xiao zhang19.0Female浙江省杭州市
2NaN20.0female江苏省苏州市
3sun quan34.0Female福建省泉州市
4guan yu39.0male广东省广州市

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

df[df["address"].str.contains("[深苏泉]")]

nameagesexaddress
0xiao ming22.0male广东省深圳市
2NaN20.0female江苏省苏州市
3sun quan34.0Female福建省泉州市

startswith

startswith的语法相对简单:

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

pat参数

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

df["address"].str.startswith("广")
0 True
1 False
2 False
3 False
4 True
Name: address, dtype: bool
df[df["address"].str.startswith("广")]

nameagesexaddress
0xiao ming22.0male广东省深圳市
4guan yu39.0male广东省广州市

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

df[df["address"].str.contains("^广")]

nameagesexaddress
0xiao ming22.0male广东省深圳市
4guan yu39.0male广东省广州市

自动区分大小写

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

df[df["sex"].str.startswith("f")]

nameagesexaddress
2NaN20.0female江苏省苏州市
df[df["sex"].str.startswith("F")]

nameagesexaddress
1Xiao zhang19.0Female浙江省杭州市
3sun quan34.0Female福建省泉州市

缺失值处理

df["name"].str.startswith("xiao")
0 True
1 False
2 NaN
3 False
4 False
Name: name, dtype: object
df[df["name"].str.startswith("xiao",na=False)]

nameagesexaddress
0xiao ming22.0male广东省深圳市

endswith

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

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

pat参数

# 以市结尾

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

nameagesexaddress
0xiao ming22.0male广东省深圳市
1Xiao zhang19.0Female浙江省杭州市
2NaN20.0female江苏省苏州市
3sun quan34.0Female福建省泉州市
4guan yu39.0male广东省广州市
# 正则的写法:contains方法

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

nameagesexaddress
0xiao ming22.0male广东省深圳市
1Xiao zhang19.0Female浙江省杭州市
2NaN20.0female江苏省苏州市
3sun quan34.0Female福建省泉州市
4guan yu39.0male广东省广州市

缺失值处理

df["name"].str.endswith("g")
0 True
1 True
2 NaN
3 False
4 False
Name: name, dtype: object
df[df["name"].str.endswith("g",na=False)]

nameagesexaddress
0xiao ming22.0male广东省深圳市
1Xiao zhang19.0Female浙江省杭州市
# 不加na参数则报错
df[df["name"].str.endswith("g")]

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


推荐阅读


机器学习神器Scikit-Learn入门.PPT

Plotly+Seaborn+Folium可视化探索爱彼迎租房数据

基于随机森林模型的心脏病患者预测分类

从统计和数据角度出发,如何看待房价?

桑基图或许可以告诉你打工人的故事!

2大模块+20个函数,完美诠释Python随机过程~

Pandas入门.PPT

尤而小屋,一个温馨的小屋。小屋主人,一手代码谋求生存,一手掌勺享受生活,欢迎你的光临

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存