Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解(三)

简介: Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解(三)

前言


Pandas处理字符文本等数据技术以及函数设计迭代的过程已经很长了,处理方法也多。很多时候我们是通过一系列需求或者想要实现的一个效果去搜寻答案和代码。或者是当获取到了这个实现功能的函数却不知道这个函数的使用方法和参数调整,这是实际开发常常遇到的问题,也是比较头疼。但是如果能够对Pandas对整个数据类型体系处理方法有个明确的认知和大体处理操作,那么久可以节省很多我们盲目搜索答案的时间,大大加快我们分析数据的效率。


此篇文章依旧紧接着上篇文章的内容,常用的处理方法已经将近讲述到过半了。处理字符文本的Pandas数据分析系列应该会随后完结。


Pandas数据分析系列专栏已经更新了很久了,基本覆盖到使用pandas处理日常业务以及常规的数据分析方方面面的问题。从基础的数据结构逐步入门到处理各类数据以及专业的pandas常用函数讲解都花费了大量时间和心思创作,如果大家有需要从事数据分析或者大数据开发的朋友推荐订阅专栏,将在第一时间学习到Pandas数据分析最实用常用的知识。此篇博客篇幅较长,涉及到处理文本数据(str/object)等各类操作,值得细读实践一番,我会将Pandas的精华部分挑出细讲实践。博主会长期维护博文,有错误或者疑惑可以在评论区指出,感谢大家的支持。


一、子串提取


提取匹配首位子串


在版本0.23之前,extract方法的参数扩展默认为False。当expand=False时,expand根据subject和正则表达式模式返回Series、Index或DataFrame。当expand=True时,它总是返回一个数据帧,从用户的角度来看,该数据帧更一致,更容易混淆。自0.23.0版以来,expand=True一直是默认值。


extract方法接受具有至少一个正则表达式。提取包含多个组的正则表达式将返回每个组一列的DataFrame。

pd.Series(
    ["a1", "b2", "c3"],
    dtype="string",
).str.extract(r"([ab])(\d)", expand=False)

b451b8e8c114445d984a1da613e28cf4.png

不匹配的元素返回一个填充有NaN的行。因此,一系列杂乱的字符串可以被“转换”成一个类似的索引序列或DataFrame,其中包含清理过的或更有用的字符串,而不需要get()来访问元组或re.match对象。结果的数据类型始终为object,即使未找到匹配项且结果仅包含NaN。


分组时列名设置:

pd.Series(["a1", "b2", "c3"], dtype="string").str.extract(
    r"(?P<letter>[ab])(?P<digit>\d)", expand=False
)

9cac85746e964c86a37dabdf65008409.png


可选分组:

pd.Series(
    ["a1", "b2", "3"],
    dtype="string",
).str.extract(r"([ab])?(\d)", expand=False)

81a5a2eeece14a3b93696d0f7954b62d.png

正则表达式中的任何捕获组名称都将用于列名;否则将使用捕获组编号。


如果expand=True,提取一组正则表达式将返回一列DataFrame。

pd.Series(["a1", "b2", "c3"], dtype="string").str.extract(r"[ab](\d)", expand=True)

886b1db1f5c649858ec960161c20daa5.png

如果expand=False,则返回为Series。


pd.Series(["a1", "b2", "c3"], dtype="string").str.extract(r"[ab](\d)", expand=False)


885d181994ff4a2d8e0eb632f237a41e.png


如果expand=True,则使用正则表达式调用具有一个捕获组的索引将返回一个具有一列的DataFrame。


s = pd.Series(["a1", "b2", "c3"], ["A11", "B22", "C33"], dtype="string")
s.index.str.extract("(?P<letter>[a-zA-Z])", expand=True)

1f8ff9197eac412ba7229dc3f8e2b4fe.png

如果expand=False,则返回索引。


s.index.str.extract("(?P<letter>[a-zA-Z])", expand=False)

1c013dd9ff8246279634e3c41cb33ef9.png

如果expand=True,则使用具有多个捕获组的正则表达式调用索引将返回DataFrame。


s.index.str.extract("(?P<letter>[a-zA-Z])([0-9]+)", expand=True)



2c91328690fa4eee88bb387edb209f7d.png

如果expand=False,则会引发ValueError。


s.index.str.extract("(?P<letter>[a-zA-Z])([0-9]+)", expand=False)

1b65113985904c6994c8db3a9102ee18.png

下表总结了extract(expand=False)的情况(第一列中输入主题,第一行中regex中的组数)

image.png


提取所有匹配项(extractall)


与extract(仅返回第一个匹配)不同:

s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"], dtype="string")
s

4c59e530e0464169b920b7375d5f1c6d.png

two_groups = "(?P<letter>[a-z])(?P<digit>[0-9])"
s.str.extract(two_groups, expand=True)

6bbf2ea77bc54625a93117c65588f1b8.png


extractall方法返回每个匹配项。extractall的结果总是一个DataFrame,其行上有MultiIndex。多重索引的最后一级名为match,表示主题中的顺序。


s.str.extractall(two_groups)


7d522b16436046c7b93bfe213abef6a1.png

当Series中的每个subject中正好有一个匹配时,extractall(pat).xs(0,level='match')与extract(pat)将得到一样的结果:


1. s = pd.Series(["a3", "b3", "c2"], dtype="string")
2. s


91491517ba28461db9083aa828594aba.png

extract_result = s.str.extract(two_groups, expand=True)
extract_result

940f545251f144d5bb0a291a9448ef3f.png


extractall_result = s.str.extractall(two_groups)
extractall_result

53271480bbaf4a96a33718bf8d90b903.png

extractall_result.xs(0, level="match")

f050dc481ed24da3b03e83a99abf46f2.png


索引Index还支持.str.extractall。它返回一个DataFrame,其结果与带有默认索引(从0开始)的Series.str.extractall相同。


pd.Index(["a1a2", "b1", "c1"]).str.extractall(two_groups)

edb78ad947f0421bbe9917461aba602a.png


二、全局字符匹配


contain检验


使用contain函数可以检测series或者dataframe中是否包含检测字符:


pattern = r"[0-9][a-z]"
pd.Series(
    ["1", "2", "3a", "3b", "03c", "4dx"],
    dtype="string",
).str.contains(pattern)

26db9551f1384ed784ce8a6e15d9f438.png

match元素匹配

pd.Series(
    ["1", "2", "3a", "3b", "03c", "4dx"],
    dtype="string",
).str.match(pattern)

1cb8850d5876441fa927ea0df32db1ce.png

match、fullmatch和contains之间的区别在于严格性:


fullmatch测试整个字符串是否与正则表达式匹配;

match是否存在从字符串的第一个字符开始的正则表达式的匹配;

contain在字符串中的任何位置是否存在正则表达式的匹配。

这三种匹配模式的re包中的相应函数为re。完全匹配,重新。匹配,再重新。搜索。


match、fullmatch、contains、StartWith和endswith等方法采用额外的na参数,因此丢失的值可以被视为True或False:


s4 = pd.Series(
    ["A", "B", "C", "Aaba", "Baca", np.nan, "CABA", "dog", "cat"], dtype="string"
)
s4.str.contains("A", na=False)

bf91fddab3a24785989542ec6ee12ea5.png

创建指标变量


可以从字符串列中提取虚拟变量。例如,如果它们由“|”分隔:


s = pd.Series(["a", "a|b", np.nan, "a|c"], dtype="string")
s.str.get_dummies(sep="|")


bae95ee3e1ae41d092a5a5dc34933196.png

字符串索引还支持get_dummies,它返回多索引。


1. idx = pd.Index(["a", "a|b", np.nan, "a|c"])
2. idx.str.get_dummies(sep="|")


63cc55ed1b524479a3b1c28a4863fab9.png



以上我们的处理文本数据(str/object)各类操作系列文章就讲完了。博主会长期维护博文,有错误或者疑惑可以在评论区指出,感谢大家的支持。

目录
相关文章
|
3天前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
【7月更文挑战第12天】Python的Pandas和NumPy库助力高效数据处理。Pandas用于数据清洗,如填充缺失值和转换类型;NumPy则擅长数组运算,如元素级加法和矩阵乘法。结合两者,可做复杂数据分析和特征工程,如产品平均销售额计算及销售额标准化。Pandas的时间序列功能,如移动平均计算,进一步增强分析能力。掌握这两者高级技巧,能提升数据分析质量和效率。
17 4
|
7天前
|
数据挖掘 Python
利用Python进行数据分析PDF下载经典数据分享推荐
**Python数据分析大师作,Wes McKinney亲著,详述数据操作、清洗与分析。第2版面向Python 3.6,涵盖pandas、NumPy、IPython和Jupyter更新,实战案例丰富;第3版已升级至Python 3.10和pandas 1.4,继续引领数据科学潮流。[PDF下载](https://zhangfeidezhu.com/?p=337)**
15 0
利用Python进行数据分析PDF下载经典数据分享推荐
|
10天前
|
数据采集 机器学习/深度学习 数据可视化
了解数据科学面试中的Python数据分析重点,包括Pandas(DataFrame)、NumPy(ndarray)和Matplotlib(图表绘制)。
【7月更文挑战第5天】了解数据科学面试中的Python数据分析重点,包括Pandas(DataFrame)、NumPy(ndarray)和Matplotlib(图表绘制)。数据预处理涉及缺失值(dropna(), fillna())和异常值处理。使用describe()进行统计分析,通过Matplotlib和Seaborn绘图。回归和分类分析用到Scikit-learn,如LinearRegression和RandomForestClassifier。
26 3
|
10天前
|
数据采集 机器学习/深度学习 数据可视化
关于Python数据分析项目的简要概述:从CSV加载数据,执行数据预处理,进行数据探索,选择线性回归模型进行训练,评估模型性能并优化,最后结果解释与可视化。
【7月更文挑战第5天】这是一个关于Python数据分析项目的简要概述:从CSV加载数据,执行数据预处理(填充缺失值,处理异常值),进行数据探索(可视化和统计分析),选择线性回归模型进行训练,评估模型性能并优化,最后结果解释与可视化。此案例展示了数据科学的典型流程。
32 2
|
1天前
|
数据采集 数据挖掘 数据处理
Python数据分析加速器:深度挖掘Pandas与NumPy的高级功能
【7月更文挑战第14天】Python的Pandas和NumPy库是数据分析的核心工具。Pandas以其高效的数据处理能力,如分组操作和自定义函数应用,简化了数据清洗和转换。NumPy则以其多维数组和广播机制实现快速数值计算。两者协同工作,如在DataFrame与NumPy数组间转换进行预处理,提升了数据分析的效率和精度。掌握这两者的高级功能是提升数据科学技能的关键。**
7 0
|
2天前
|
数据处理 Python
数据科学进阶之路:Pandas与NumPy高级操作详解与实战演练
【7月更文挑战第13天】探索数据科学:Pandas与NumPy提升效率的高级技巧** - Pandas的`query`, `loc`和`groupby`用于复杂筛选和分组聚合,例如筛选2023年销售额超1000的记录并按类别计总销售额。 - NumPy的广播和向量化运算加速大规模数据处理,如快速计算两个大数组的元素级乘积。 - Pandas DataFrame基于NumPy,二者协同加速数据处理,如将DataFrame列转换为NumPy数组进行标准化再回写,避免链式赋值。 掌握这些高级操作,实现数据科学项目的效率飞跃。
8 0
|
3天前
|
数据挖掘 数据处理 决策智能
Python 数据分析工具箱:深挖 Pandas 与 NumPy 高级功能,驱动智能决策
【7月更文挑战第12天】Python的Pandas和NumPy是数据分析的基石。Pandas提供灵活的数据结构如DataFrame,用于高效处理关系型数据,而NumPy则以多维数组和科学计算功能著称。两者结合,支持数据合并(如`pd.merge`)、时间序列分析(`pd.to_datetime`)和高级数组运算。通过掌握它们的高级特性,能提升数据分析效率,应用于各领域,如金融风险评估、市场分析和医疗预测,助力数据驱动的决策。学习和熟练运用Pandas与NumPy是成为出色数据分析师的关键。
|
10天前
|
存储 消息中间件 数据挖掘
Python实时数据分析:利用丰富的库(如Pandas, PySpark, Kafka)进行流处理,涵盖数据获取、预处理、处理、存储及展示。
【7月更文挑战第5天】Python实时数据分析:利用丰富的库(如Pandas, PySpark, Kafka)进行流处理,涵盖数据获取、预处理、处理、存储及展示。示例代码展示了从Kafka消费数据,计算社交媒体活跃度和物联网设备状态,并可视化结果。适用于监控、故障检测等场景。通过学习和实践,提升实时数据分析能力。
19 0
|
10天前
|
机器学习/深度学习 数据采集 数据可视化
Python数据分析入门涉及基础如Python语言、数据分析概念及优势。
【7月更文挑战第5天】Python数据分析入门涉及基础如Python语言、数据分析概念及优势。关键工具包括NumPy(数组操作)、Pandas(数据处理)、Matplotlib(绘图)、Seaborn(高级可视化)和Scikit-learn(机器学习)。流程涵盖数据获取、清洗、探索、建模、评估和展示。学习和实践这些将助你有效利用数据。
|
6天前
|
机器学习/深度学习 监控 算法
Python数据分析与机器学习在金融风控中的应用
Python数据分析与机器学习在金融风控中的应用
32 12