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

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

前言


此文章紧接上篇文章内容:Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解(一)


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


一、拆分和替换字符串


拆分split()


拆分字符串我们一般回用到split这个函数,使用起来非常方便:


s2 = pd.Series(["a_b_c", "c_d_e", np.nan, "f_g_h"], dtype="string")
s2.str.split("_")

489eb496ae444a298df8afd2ed651af4.png


拆分后获取get()


拆分后数据将还是数组类型,因此使用get或者索引方法获取就好了。需要注意的是大体上还是series类型:


s2.str.split("_").str.get(0)

ecf8326b84084710bb58897772715f6d.png

s2.str.split("_").str[0]

dc2c8ba49a324b4494d67d15d467bcb2.png


多维转换


而且我们可以扩展拆分之后的数据,形成多维数据:


s2.str.split("_", expand=True)


f5781d99cfb546db8146c57a95880689.png


当原始序列具有StringDtype时,输出列也将是StringDtype类型。

也可以限制拆分的数量:


s2.str.rsplit("_", expand=True, n=1)


65909f6595ea45699c1c04b4bf8367ac.png


替换replace()


替换的话可以使用正则也可以使用replace,复杂的话还是正则更好,常规使用replace就好了。


我们先创建测试用例:


s3 = pd.Series(
    ["A", "B", "C", "Aaba", "Baca", "", np.nan, "CABA", "dog", "cat"],
    dtype="string",
)
s3

d2c443bb139d4df69cdcb2da35d7681d.png


之后使用replace中正则替换就好:


s3.str.replace("^.a|dog", "XX-XX ", case=False, regex=True)


a7e768b04263459a837e2247764bfddd.png

如果希望字符串的文字替换(相当于str.replace()),可以将可选的正则表达式参数设置为False,而不是转义每个字符。在这种情况下,pat和repl都必须是字符串:

dark_souls = pd.Series(["Yorm", "&attack", "&100"], dtype="string")
dark_souls


5ea8adad9ea34cfbbf0ca88852229d5a.png

dark_souls.str.replace(r'\&','-',regex=True)

03ade74ee139475d89f4c901bdefb1a8.png

dark_souls.str.replace('&','-',regex=False)

e8f8e5ce698846289a94363ea569acd8.png

replace方法还可以将可调用的自定义方法作为替换。使用re.sub()在每个pat上调用它。可调用函数可获一个位置参数(正则表达式对象)并返回一个字符串。


这里我们可以实现一个字符串颠倒转换:

pat = r"[a-z]+"
def repl(m):
    return m.group(0)[::-1]
pd.Series(["foo 123", "bar baz", np.nan], dtype="string").str.replace(
    pat, repl, regex=True
)

1e98d5a8e6774c8795b66a31822ebfba.png


若是对正则匹配不是很了解的可以去阅读一下博主另一篇文章:

Python正则表达式一文详解+实例代码展示


replace方法还接受来自re的已编译正则表达式对象,编译re.compile()作为模式。所有标志都应包含在编译的正则表达式对象中。

import re
regex_pat = re.compile(r"^.a|dog", flags=re.IGNORECASE)
s3.str.replace(regex_pat, "XX-XX ", regex=True)

199c397bd4b44cf5bdaa2cf1392778a1.png

使用编译的正则表达式对象调用替换时包含标志参数将引发ValueError。


s3.str.replace(regex_pat, 'XX-XX ', flags=re.IGNORECASE)

b0360fe0aea045cba0230ad0ecc5e567.png

removeprefix和removesuffix与str.removeprefix和str.removesuffix具有相同的效果,都可以将匹配出的字符串删除。


s = pd.Series(["str_foo", "str_bar", "no_prefix"])
s.str.removesuffix("_str")

这个方法只在3.9以上版本才有。


二、连接操作


基于cat(),resp。Index.str.cat的方法可以将序列或索引与自身或其他序列或索引连接起来。


串联Series


Series(或index)的值可以串联:


s = pd.Series(["a", "b", "c", "d"], dtype="string")
s.str.cat(sep=",")

24df90ba7803462ea463997d0b31d7db.png

如果未指定,分隔符的关键字sep默认为空字符串,sep=“”:


s.str.cat()


9ab275fd8ff34488a9e0a300fea5c5e4.png

默认情况下,忽略缺少的值。使用na_rep可以替换空值:


1. t = pd.Series(["a", "b", np.nan, "d"], dtype="string")
2. t.str.cat(sep=",")


2c1ec90c9d5043958969e58daee65495.png

t.str.cat(sep=",", na_rep="-")

1addf7708d5d4e27a3abe21c334817fb.png


串联list与Series


cat()的第一个参数可以是一个类似列表的对象,只要它匹配调用序列(或索引)的长度。


s.str.cat(["A", "B", "C", "D"])


任何一侧的缺失值也会导致结果中的缺失值,除非指定了na_rep:


s.str.cat(t)



54e7c2b724744f37943055c85d11d0df.png

s.str.cat(t, na_rep="-")

cc65c2fe1cc5417b89758d3b2a1e6bf7.png

串联array和Series


其他参数也可以是二维的。在这种情况下,行数必须与调用序列(或索引)的长度匹配。

我们先可以concat连接一下两个series,不了解concat的推荐去看博主另一篇博文:

DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示_fanstuck的博客-CSDN博客_dataframe merge函数


d = pd.concat([t, s], axis=1)


合并操作可以将DataFrame的列数据全都合并拼接。


s.str.cat(d, na_rep="-")

8c413dd373ba4a228f3c69756eb79862.png

索引自动拼接


对于串联series或dataframe,可以通过设置join关键字在串联之前对齐索引。


u = pd.Series(["b", "d", "a", "c"], index=[1, 3, 0, 2], dtype="string")


a7f893adda4246e4b317c4f2c802a3b4.png

s.str.cat(u)

d692660c55294cb9b4c096ead87c7742.png

s.str.cat(u, join="left")


ad0b8407235c4c43bda9abd028e05c45.png

如果没有传递join关键字,方法cat()当前将返回到版本0.23.0之前的行为(即没有对齐),但如果任何涉及的索引不同,则将发出警告,因为在将来的版本中,此默认值将更改为join='left'。


join参数的常用选项是('left','outer','inner','right')。


v = pd.Series(["z", "a", "b", "d", "e"], index=[-1, 0, 1, 3, 4], dtype="string")
v

25a0e1109a8f40999e21db60dca016cb.png

我们与s进行合并测试:


s

a50799c6f8d443b7b3b33b45bb315a00.png

s.str.cat(v, join="right", na_rep="-")

03667a079ef9444480148936a5dbc324.png

s.str.cat(v, join="outer", na_rep="-")

88fa5c727bb5433abe8f32f0745511ca.png

同样可适用于DataFrame:


1. f = d.loc[[3, 2, 1, 0], :]
2. f


1646402fd88d4c078b44981a693053fc.png


与s进行合并拼接:


s.str.cat(f, join="left", na_rep="-")


eb1ed70a85f04c059da6760a9b72ccff.png

多对象串联拼接


几个类似数组的项(特别是:系列、索引和np.ndarray的一维变体)可以组合在类似列表的容器中(包括迭代器、dict视图等)。


s.str.cat([u, u.to_numpy()], join="left")

88d9d680a33c4d8496a38fe51c03a012.png


传递的列表中没有索引(例如np.ndarray)的所有元素都必须在长度上与调用序列(或索引)匹配,但序列和索引可以具有任意长度(只要不使用join=None禁用对齐):


s.str.cat([v, u, u.to_numpy()], join="outer", na_rep="-")

1ada1a982c7a4be3a80b05ad2c064711.png

如果在包含不同索引的列表中使用join='right',则这些索引的并集将用作最终连接的基础:


s.str.cat([u.loc[[3]], v.loc[[-1, 0]]], join="right", na_rep="-")


09d2a997fb0f43b6817fb5087d53c02a.png


str[]索引


您可以使用[]符号直接按位置位置索引。如果索引超过字符串的结尾,结果将是NaN。

s = pd.Series(
    ["A", "B", "C", "Aaba", "Baca", np.nan, "CABA", "dog", "cat"], dtype="string"
)
s.str[0]

5a24618e69044771b00c68dd16254f03.png

s.str[1]

c7c20361e534490bbcfeeb069cd867ce.png

目录
相关文章
|
3月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
474 0
|
6月前
|
自然语言处理 数据挖掘 数据处理
告别低效代码:用对这10个Pandas方法让数据分析效率翻倍
本文将介绍 10 个在数据处理中至关重要的 Pandas 技术模式。这些模式能够显著减少调试时间,提升代码的可维护性,并构建更加清晰的数据处理流水线。
222 3
告别低效代码:用对这10个Pandas方法让数据分析效率翻倍
|
8月前
|
数据采集 安全 数据挖掘
Pandas数据合并:10种高效连接技巧与常见问题
在数据分析中,数据合并是常见且关键的步骤。本文针对合并来自多个来源的数据集时可能遇到的问题,如列丢失、重复记录等,提供系统解决方案。基于对超1000个复杂数据集的分析经验,总结了10种关键技术,涵盖Pandas库中`merge`和`join`函数的使用方法。内容包括基本合并、左连接、右连接、外连接、基于索引连接、多键合并、数据拼接、交叉连接、后缀管理和合并验证等场景。通过实际案例与技术原理解析,帮助用户高效准确地完成数据整合任务,提升数据分析效率。
745 13
Pandas数据合并:10种高效连接技巧与常见问题
|
10月前
|
SQL 人工智能 算法
TDengine 发布时序数据分析 AI 智能体 TDgpt,核心代码开源
2025 年 3 月 26 日,涛思数据通过线上直播形式正式发布了其新一代时序数据分析 AI 智能体——TDgpt,并同步开源其核心代码(GitHub 地址:https://github.com/taosdata/TDengine)。这一创新功能作为 TDengine 3.3.6.0 的重要组成部分,标志着时序数据库在原生集成 AI 能力方面迈出了关键一步。
616 0
|
5月前
|
机器学习/深度学习 算法 数据挖掘
【数据分析】基于matlab私家车充电模型(含私家车日行驶距离概率密度及累加函数,电动汽车出发时间(或者称开始充电的时间)概率)(Matlab代码实现)
【数据分析】基于matlab私家车充电模型(含私家车日行驶距离概率密度及累加函数,电动汽车出发时间(或者称开始充电的时间)概率)(Matlab代码实现)
125 0
|
11月前
|
监控 物联网 数据处理
Pandas高级数据处理:数据流式计算
本文介绍了如何使用 Pandas 进行流式数据处理。流式计算能够实时处理不断流入的数据,适用于金融交易、物联网监控等场景。Pandas 虽然主要用于批处理,但通过分块读取文件、增量更新 DataFrame 和使用生成器等方式,也能实现简单的流式计算。文章还详细讨论了内存溢出、数据类型不一致、数据丢失或重复及性能瓶颈等常见问题的解决方案,并建议在处理大规模数据时使用专门的流式计算框架。
609 100
Pandas高级数据处理:数据流式计算
|
11月前
|
数据采集 数据可视化 数据处理
Pandas高级数据处理:数据仪表板制作
《Pandas高级数据处理:数据仪表板制作》涵盖数据清洗、聚合、时间序列处理等技巧,解决常见错误如KeyError和内存溢出。通过多源数据整合、动态数据透视及可视化准备,结合性能优化与最佳实践,助你构建响应快速、数据精准的商业级数据仪表板。适合希望提升数据分析能力的开发者。
301 31
|
11月前
|
缓存 数据可视化 BI
Pandas高级数据处理:数据仪表板制作
在数据分析中,面对庞大、多维度的数据集(如销售记录、用户行为日志),直接查看原始数据难以快速抓住重点。传统展示方式(如Excel表格)缺乏交互性和动态性,影响决策效率。为此,我们利用Python的Pandas库构建数据仪表板,具备数据聚合筛选、可视化图表生成和性能优化功能,帮助业务人员直观分析不同品类商品销量分布、省份销售额排名及日均订单量变化趋势,提升数据洞察力与决策效率。
246 12
|
11月前
|
消息中间件 数据挖掘 数据处理
Pandas高级数据处理:数据流式计算
在大数据时代,Pandas作为Python强大的数据分析库,在处理结构化数据方面表现出色。然而,面对海量数据时,如何实现高效的流式计算成为关键。本文探讨了Pandas在流式计算中的常见问题与挑战,如内存限制、性能瓶颈和数据一致性,并提供了详细的解决方案,包括使用`chunksize`分批读取、向量化操作及`dask`库等方法,帮助读者更好地应对大规模数据处理需求。
242 17
|
11月前
|
数据采集 存储 数据可视化
Pandas高级数据处理:数据报告生成
Pandas 是数据分析领域不可或缺的工具,支持多种文件格式的数据读取与写入、数据清洗、筛选与过滤。本文从基础到高级,介绍如何使用 Pandas 进行数据处理,并解决常见问题和报错,如数据类型不一致、时间格式解析错误、内存不足等。最后,通过数据汇总、可视化和报告导出,生成专业的数据报告,帮助你在实际工作中更加高效地处理数据。
313 8