查看原文
其他

使用Pandas库处理文本数据 | 推荐

The following article is from 关于数据分析与可视化 Author 俊欣


文末含代码下载链接

今天我们来谈论一下pandas库当中文本数据的操作,希望大家再看完本篇文章之后会有不少的收获,我们大致会讲
  • 创建一个包含文本数据的DataFrame
  • 常用处理文本数据的方法的总结
  • 正则表达式与DataFrame内部方法的结合

创建文本内容的数据

我们先来创建一个包含文本数据的DataFrame,来供我们后面使用

import pandas as pd
df = pd.DataFrame({
   "姓": ["李","王","戴""李""张"],
   "名": ["华","硕","建业""四""三"],
   "户籍地址": [" 浙江省·宁波市 ""   浙江省·杭州市    ""  浙江省·丽水市  ""  浙江省·衢州市 ""  浙江省·湖州市           "],
   "微信ID": ["Tomoplplplut1248781""Smopopo857""Adahuhuifhhjfj""Tull1945121""ZPWERERTFD599557"],
   "邮箱地址": ["tom02159@163.com""smitt7821@163.com""adams623@163.com""tull0305@163.com""five7532@163.com"]
})

df

output

   姓   名                  户籍地址                 微信ID               邮箱地址
0  李   华              浙江省·宁波市   Tomoplplplut1248781   tom02159@163.com
1  王   硕           浙江省·杭州市               Smopopo857  smitt7821@163.com
2  戴  建业             浙江省·丽水市         Adahuhuifhhjfj   adams623@163.com
3  李   四              浙江省·衢州市           Tull1945121   tull0305@163.com
4  张   三    浙江省·湖州市                ZPWERERTFD599557   five7532@163.com

常用处理文本数据的方法总结

Python当中用来处理字符串数据的方法有很多,基本上都可以在DataFrame内部拿来使用,例如lower()方法和upper()方法,给字母大小写
df["微信ID"].str.lower()

output

0    tomoplplplut1248781
1             smopopo857
2         adahuhuifhhjfj
3            tull1945121
4       zpwerertfd599557
Name: 微信ID, dtype: object

又譬如

df["微信ID"].str.len()

output

0    19
1    10
2    14
3    11
4    16
Name: 微信ID, dtype: int64

当然我们看到户籍地址这一列中的数据有很多的空格

df["户籍地址"]

output

0                浙江省·宁波市 
1             浙江省·杭州市    
2               浙江省·丽水市  
3                浙江省·衢州市 
4      浙江省·湖州市           
Name: 户籍地址, dtype: object

我们可以使用处理字符串时的strip()方法

df["户籍地址"].str.strip()

output

0    浙江省·宁波市
1    浙江省·杭州市
2    浙江省·丽水市
3    浙江省·衢州市
4    浙江省·湖州市
Name: 户籍地址, dtype: object

与之相类似的还有lstrip()方法以及rstrip()方法,这里就不做赘述。

在字符串的处理过程当中,startswith()方法和endswith()方法也是用的非常的频繁,例如我们想要挑选出户籍地址是“宁波市”的数据,
df["户籍地址"] = df["户籍地址"].str.strip()
df[df["户籍地址"].str.endswith("宁波市")]

output

   姓  名     户籍地址                 微信ID              邮箱地址
0  李  华  浙江省·宁波市  Tomoplplplut1248781  tom02159@163.com

另外我们还可以使用replace()方法来实现当中的字符串的替换

df["户籍地址"].str.replace("·""--")

output

0    浙江省--宁波市
1    浙江省--杭州市
2    浙江省--丽水市
3    浙江省--衢州市
4    浙江省--湖州市
Name: 户籍地址, dtype: object

那既然用到了replace()方法,那么split()方法也可以尝试一下

df["户籍地址"].str.split("·")

output

0    [浙江省, 宁波市]
1    [浙江省, 杭州市]
2    [浙江省, 丽水市]
3    [浙江省, 衢州市]
4    [浙江省, 湖州市]
Name: 户籍地址, dtype: object
在经过spilit()方法的切割过之后就变成了列表的形式,然后可以通过get()方法或者[]来获取里面的元素,例如
df["户籍地址"].str.split("·").str.get(0)

或者

df["户籍地址"].str.split("·").str[0]

output

0    浙江省
1    浙江省
2    浙江省
3    浙江省
4    浙江省
Name: 户籍地址, dtype: object
那么获取列表当中的第二个元素也是同样的道理,当然我们也可以在split()方法当中添加expand=True这个参数,来将上面列表形式的数据转化成DataFrame格式
df["户籍地址"].str.split("·", expand=True)

output

     0    1
0  浙江省  宁波市
1  浙江省  杭州市
2  浙江省  丽水市
3  浙江省  衢州市
4  浙江省  湖州市

同样地,我们可以在后面添加[]来获取我们想要的元素

df["户籍地址"].str.split("·", expand=True)[1]

output

0    宁波市
1    杭州市
2    丽水市
3    衢州市
4    湖州市
Name: 1, dtype: object

正则表达式与DataFrame内部方法的结合

假如我们想要提取文本数据内部的一部分数据,可以结合正则表达式来使用,例如我们想要提取“微信ID”这一列当中的字母和数字,并且将两者分开来
two_groups = "([a-zA-Z]+)([0-9]+)"
df["微信ID"].str.extract(two_groups, expand=True)

output

              0        1
0  Tomoplplplut  1248781
1       Smopopo      857
2           NaN      NaN
3          Tull  1945121
4    ZPWERERTFD   599557
当然了,如果想是要提取文本数据中的部分数据,可以直接在str方法后面添加索引,例如
df["邮箱地址"].str[-8:]

output

0    @163.com
1    @163.com
2    @163.com
3    @163.com
4    @163.com
Name: 邮箱地址, dtype: object
当然,从另外一个角度讲,正则表达式也可以帮助我们确认文本数据是否符合某种规律,
two_groups = "([a-zA-Z]+)([0-9]+)"
df["微信ID"].str.match(two_groups)

output

0     True
1     True
2    False
3     True
4     True
Name: 微信ID, dtype: bool
当中有一个为False,不满足字母+数字的规律,我们再进一步,将满足条件的数据提取出来
df[df["微信ID"].str.match(two_groups)]

output

   姓  名     户籍地址                 微信ID               邮箱地址
0  李  华  浙江省·宁波市  Tomoplplplut1248781   tom02159@163.com
1  王  硕  浙江省·杭州市           Smopopo857  smitt7821@163.com
3  李  四  浙江省·衢州市          Tull1945121   tull0305@163.com
4  张  三  浙江省·湖州市     ZPWERERTFD599557   five7532@163.com

针对文本数据而言,contains()方法也能够派上用场,例如下面的数据

   姓   名                  户籍地址                 微信ID               邮箱地址
0  李   华              浙江省·宁波市   Tomoplplplut1248781   tom02159@163.com
1  王   硕           浙江省·杭州市               Smopopo857  smitt7821@163.com
2  戴  建业             浙江省·丽水市         Adahuhuifhhjfj   adams623@163.com
3  李   四              浙江省·衢州市           Tull1945121   tull0305@163.com
4  张   三    浙江省·湖州市                ZPWERERTFD599557   five7532@163.com
5  黄   五               浙江省·宁波市        hunhunhu45652  1erdcvf127@16.com

我们用contains()来提取出户籍地址为“宁波市”的内容,可以这么做

df[df["户籍地址"].str.contains("宁波市")]

output

   姓  名     户籍地址                 微信ID               邮箱地址
0  李  华  浙江省·宁波市  Tomoplplplut1248781   tom02159@163.com
5  黄  五  浙江省·宁波市        hunhunhu45652  1erdcvf127@16.com

暂时就这些了,下一篇原创的文章安排在周天,非技术方面的,期待一下?

代码下载

https://github.com/hidadeng/DaDengAndHisPython/blob/master/文本数据处理Pandas篇.ipynb


近期文章

视频专栏课 | Python网络爬虫与文本分析

推荐 | cntext 中文文本分析库

Shifterator库 | 词移图分辨两文本用词风格差异

如何在DataFrame中使用If-Else条件语句创建新列

BERTopic 主题建模库 | 建议收藏

KeyBERT库 | 自动挖掘文本中的关键词

DataShare | 6000+个股票的每日财经新闻  

SmartScraper | 简单、自动、快捷的Python网络爬虫

SHAP | 机器学习模型解释库

读完本文你就了解什么是文本分析

文本分析在经管领域中的应用概述

综述:文本分析在市场营销研究中的应用

文本分析方法在《管理世界》(2021.5)中的应用

中文金融情感词典发布啦 | 附代码

wordexpansion包 | 新增词向量法构建领域词典

语法最简单的微博通用爬虫weibo_crawler

hiResearch 定义自己的科研首页

SciencePlots | 科研样式绘图库

plydata库 | 数据操作管道操作符>>

plotnine: Python版的ggplot2作图库

Wow~70G上市公司定期报告数据集

漂亮~pandas可以无缝衔接Bokeh  

YelpDaset: 酒店管理类数据集10+G


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

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