当前位置: 首页 > news >正文

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

目录

前言

一、拆分和替换字符串

拆分split()

 拆分后获取get()

多维转换

 替换replace()

二、连接操作

串联Series

 串联list与Series

串联array和Series

索引自动拼接

多对象串联拼接

 .str[]索引

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢


前言

 此文章紧接上篇文章内容: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("_")

 拆分后获取get()

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

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

 

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

 

多维转换

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

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

 

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

也可以限制拆分的数量:

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

 替换replace()

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

我们先创建测试用例:

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

 

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

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

 

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

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

 

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

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

 

 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
)

 

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

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)

 

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

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

 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=",")

 

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

s.str.cat()

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

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

 

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

 

 串联list与Series

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

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

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

s.str.cat(t)

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

 

串联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="-")

索引自动拼接

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

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

 

s.str.cat(u)

 

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

 

 如果没有传递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

 

 我们与s进行合并测试:

s

 

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

 

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

 

同样可适用于DataFrame:

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

 

 与s进行合并拼接:

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

 

多对象串联拼接

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

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

 

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

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

 

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

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

 

 .str[]索引

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

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

 

s.str[1]

 


点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见。

相关文章:

  • java毕业设计的家居销售网站mybatis+源码+调试部署+系统+数据库+lw
  • 【Linux操作系统】——网络配置与SSH远程
  • 【C++】走进 ⌈ 类和对象 ⌋ 的核心 - 感受C++的精华 _ 剖析默认成员函数 | 构造函数 | 析构函数 | 拷贝构造函数 | 赋值运算符重载
  • 笔试强训(二)
  • Educational Codeforces Round 132 (Rated for Div. 2) A.B.D
  • MMDetection训练自己的数据集
  • 【Servlet】这一文详细的讲述了Servlet的知识,呕心沥血,终于文成。
  • MyBatis-Plus--使用雪花算法生成主键ID--使用/分析
  • 开源 SPL 强化 MongoDB 计算
  • class09:ejs模块
  • C/C++ 网络库 boost asio 使用详解
  • 【JS】JavaScript入门笔记第四弹之函数、作用域~
  • JAVA猎才优秀博主分享
  • Python学习:如何实现文件编码的检测
  • RDD的转换Value类型map(func)案例_大数据培训
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【刷算法】从上往下打印二叉树
  • CentOS 7 防火墙操作
  • centos安装java运行环境jdk+tomcat
  • DataBase in Android
  • Debian下无root权限使用Python访问Oracle
  • docker容器内的网络抓包
  • Javascript 原型链
  • JavaWeb(学习笔记二)
  • JS笔记四:作用域、变量(函数)提升
  • js写一个简单的选项卡
  • mysql_config not found
  • nfs客户端进程变D,延伸linux的lock
  • session共享问题解决方案
  • Spark RDD学习: aggregate函数
  • spring boot 整合mybatis 无法输出sql的问题
  • uva 10370 Above Average
  • 工程优化暨babel升级小记
  • 关于字符编码你应该知道的事情
  • 类orAPI - 收藏集 - 掘金
  • 聊聊redis的数据结构的应用
  • 浅谈Golang中select的用法
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何解决微信端直接跳WAP端
  • 我的面试准备过程--容器(更新中)
  • 写代码的正确姿势
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • Linux权限管理(week1_day5)--技术流ken
  • #include<初见C语言之指针(5)>
  • #预处理和函数的对比以及条件编译
  • (1)(1.13) SiK无线电高级配置(六)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (C语言)fgets与fputs函数详解
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (动态规划)5. 最长回文子串 java解决
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .bat批处理(六):替换字符串中匹配的子串
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选