用正则表达式处理Pandas数据 (1)匹配行 (2)提取匹配文字 (3)提取匹配文字的一部分 ---- 统计师的Python日记【第9天:正则表达式】 前言 根据我的Python学习计划: Numpy 所以search()只记录了第一个匹配项的开头和结束位置。 还有一个函数 match(),与search()不同之处在于,它只匹配字符串的开头部分: ? , i): #判断是否匹配 matchPro.append(i) #如果匹配了就把这个观测值放进matchPro中去 pd.DataFrame(matchPro, columns=[ ,这一行是产品的名字和数字编码放在一起了,我只想要数字编码的部分,即红色部分,前面的不想要,怎么办? 第一部分中介绍了search()提取了匹配部分的开头和结尾部分,这个一定可以帮我解决! 先把数据读入Pandas,仍然命名为production: ?
为此,我的做法如下: 匹配逗号是被成对引号包围的字符串。 将匹配到的字符串中的逗号替换为特定字符。 将替换后的新字符串替换回原字符串。 在将原字符串中的特定字符串替换为逗号。 可以看到pandas读取出的该位置数据也是字符串,引号正是作为一个字符串声明而存在。 再次修改正则: def split_by_dot_escape_quote(string): """ 按逗号分隔字符串,若其中有引号,将引号内容视为整体 """ # 匹配引号中的内容,非贪婪 ,则匹配0次也可,并不会匹配任意字符(环视只匹配位置不匹配字符), # 由于在任意字符后面又限定了前面匹配到的quote,故只会匹配到", # +? 则会限定前面必有字符被匹配,故"",或引号中任意值都可匹配到 pattern = re.compile('(?=(?P<quote [\'\"])).+?(?
提供包括云服务器,云数据库在内的90+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。
在第一个引号匹配之后,.* 获取行中直到下一个转义的引号的所有字符。获取引号内的名字。每个名字都在方括号内打印出,因为re.findall 以列表形式返回匹配内容。如果我们需要获取电子邮件地址呢? 只是匹配模式有些许不同,让我们逐一攻破。 以下是如何匹配电子邮件地址的前面部分: ? 电子邮件总是包含@符号,让我们从它开始。电子邮件@符号之前的部分可能包含字母数字字符,\w 就派上用场。 第一个参数是匹配的模式,第二个参数是要搜索的字符串范围。这里为了简洁起见,我们已经将结果赋值给match 变量。 第一个是被代替的子字符串,第二是想要放在目标位置的字符串,而第三是主字符串。 pandas 中的正则表达式 现在我们有了正则表达式的一些基础知识,我们可以尝试一些更复杂的。 然后我们创建一个空的列表emails 用来存放包含每个电子邮件详细信息的字典。 我们经常将代码的结果打印到屏幕上来判断代码是对还是错。
第一个参数是所要匹配的模式,第二个是要在其中查找的字符串。这里为了简洁我们已经分配了 match 变量的结果。 否则,我们就将 r_email 和 r_name 赋值为 None。 然后,我们将匹配对象变成字符串,并将它们加入字典。 在正则表达式中,+ 匹配 1 个或多个其左侧模式的实例。因此 \d+ 可以匹配 DD 部分,不管是一个数字还是两个数字。 在那之后,有一个空格。用 \s 代表,可以查找空白字符。 但值得说明一下我们做出这个决定的方式。但是,首先我们需要了解一下方括号 [ ] 在正则表达式中的含义。 [ ] 匹配放置于其中的任意字符。 如果你在操作实际数据集这样显示,你会看到整个电子邮件。 使用 pandas 操作数据 将字典放入列表后,我们就能使用 pandas 库来轻松操作这些数据了。
本文我就将带大家学习pandas中常用的一些高效字符串处理方法,提升日常数据处理分析效率: image.png 2 pandas常用字符串处理方法 pandas中的常用字符串处理方法,可分为以下几类: ,在pandas中此类字符串处理方法主要有: 2.2.1 利用startswith()与endswith()匹配字符串首尾 当我们需要判断字符型Series中的每个元素是否以某段字符片段开头或结尾时 ,而从pandas1.1.0版本开始,新增了fullmatch()方法,可以帮助我们传入正则表达式来判断目标字符串是否可以完全匹配,其参数同match(),下面是一个简单的例子: 2.3 生成型方法 生成型方法这里指的是,基于原有的单列字符型Series数据,按照一定的规则产生出新计算结果的一系列方法,pandas中常用的有: 2.3.1 利用slice()进行字符切片 当我们想要对字符型Series : 2.4.2 利用pd.to_numeric()修复数值错误 有些情况下,我们从外部数据源(如excel表)中读入的数据,由于原始数据文件加工的问题,导致一些数值型字段中的某些单元格混入非数值型字符
日期功能 本节将提到“日期”,但时间戳的处理方式类似。 我们可以将日期功能分为两部分:解析和输出。在Excel电子表格中,日期值通常会自动解析,但如果您需要,还有一个 DATEVALUE 函数。 如果找到子字符串,则该方法返回其位置。如果未找到,则返回 -1。请记住,Python 索引是从零开始的。 tips["sex"].str.find("ale") 结果如下: 3. 在 Pandas 中提取单词最简单的方法是用空格分割字符串,然后按索引引用单词。请注意,如果您需要,还有更强大的方法。 : 与 VLOOKUP 相比,merge 有许多优点: 查找值不需要是查找表的第一列; 如果匹配多行,则每个匹配都会有一行,而不仅仅是第一行; 它将包括查找表中的所有列,而不仅仅是单个指定的列; 它支持更复杂的连接操作 填充柄 在一组特定的单元格中按照设定的模式创建一系列数字。在电子表格中,这将在输入第一个数字后通过 shift+drag 或通过输入前两个或三个值然后拖动来完成。
文件的指针将会放在文件的开头。这是默认模式。 w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 a 打开一个文件用于追加。 如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。 如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。 如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 ab+ 以二进制格式打开一个文件用于追加。 sep : str 字符串, 如果文件是文本文件, 那么该值为数据间的分隔符。空("")分隔符表示该文件应该作为二进制文件处理。分隔符中的空格(" ")匹配零个或多个空格字符。
本文我就将带大家学习pandas中常用的一些高效字符串处理方法,提升日常数据处理分析效率: 2 pandas常用字符串处理方法 pandas中的常用字符串处理方法,可分为以下几类: 2.1 拼接合成类方法 ,在pandas中此类字符串处理方法主要有: 2.2.1 利用startswith()与endswith()匹配字符串首尾 当我们需要判断字符型Series中的每个元素是否以某段字符片段开头或结尾时,就可以使用到 ,而从pandas1.1.0版本开始,新增了fullmatch()方法,可以帮助我们传入正则表达式来判断目标字符串是否可以「完全匹配」,其参数同match(),下面是一个简单的例子: 2.3 生成型方法 「生成型」方法这里指的是,基于原有的单列字符型Series数据,按照一定的规则产生出新计算结果的一系列方法,pandas中常用的有: 2.3.1 利用slice()进行字符切片 当我们想要对字符型Series : 2.4.2 利用pd.to_numeric()修复数值错误 有些情况下,我们从外部数据源(如excel表)中读入的数据,由于原始数据文件加工的问题,导致一些数值型字段中的某些单元格混入非数值型字符
例如我们想求出每一条订单对应的日期。需要从订单时间ts或者orderid中截取。在pandas中,我们可以将列转换为字符串,截取其子串,添加为新的列。 pandas和SQL代码如下所示,注意使用like时,%是通配符,表示匹配任意长度的字符。 ? 在pandas中,我们采用的做法是先把原来orderid列转为字符串形式,并在每一个id末尾添加一个逗号作为分割符,然后采用字符串相加的方式,将每个uid对应的字符串类型的订单id拼接到一起。 代码和效果如下所示。为了减少干扰,我们将order数据重新读入,并设置了pandas的显示方式。 ? 可以看到,同一个uid对应的订单id已经显示在同一行了,订单id之间以逗号分隔。 我们的目标是将原始以字符串形式存储的数组元素解析出来。 ? ? 先来看pandas中如何实现,这里我们需要用到literal_eval这个包,能够自动识别以字符串形式存储的数组。
使用内置的 Pandas 方法进行高级数据处理和字符串操作 Pandas 库被广泛用作数据处理和分析工具,用于从数据中清理和提取特征。 在处理数据时,编辑或删除某些数据作为预处理步骤的一部分。 在这篇文章中,让我们具体看看在 DataFrame 中的列中替换值和子字符串。当您想替换列中的每个值或只想编辑值的一部分时,这会派上用场。 如果您想继续,请在此处下载数据集并加载下面的代码。 Pandas 中的 replace 方法允许您在 DataFrame 中的指定系列中搜索值,以查找随后可以更改的值或子字符串。 否则,replace 方法只会更改“Of The”的列值,因为它只会匹配整个值。 您可以通过匹配确切的字符串并提供您想要更改的整个值来完成我们上面所做的相同的事情,如下所示。 首先,如果有多个想要匹配的正则表达式,可以在列表中定义它们,并将其作为关键字参数传递给 replace 方法。然后,只需要显式传递另一个关键字参数值来定义想要的替换值。
然后,我们只需将s_email 匹配的对象转换为字符串并将其分配给变量sender_email 即可。 如果 date 不为 None ,我们就把它从这个匹配对象转换成一个字符串,然后赋值给变量 date_sent,再将其键值添加到字典中。 用日期字符串来举例: ? 如果使用 * 我们将匹配到大于等于零个的结果,而 + 匹配大于等于一个的结果。参照以上示例,我们输出了两种不同的结果,它们之间存在非常大的差异。 使用 pandas 处理数据 如果使用 pandas 库处理列表中的字典 那将非常简单。每个键会变成列名, 而键值变成行的内容。 我们需要做的就是使用如下代码: ? emails_df['sender_email'] 选择了标记为 sender_email的列,接下来,如果在该列中匹配到 子字符串 "maktoob" 或 "spinfinder" ,则str.contains
或字典(用于重命名行标签和列标签) reindex,接收一个新的序列与已有标签列匹配,当原标签列中不存在相应信息时,填充NAN或者可选的填充值 set_index/reset_index,互为逆操作, 切片形式访问时按行进行查询,又区分数字切片和标签切片两种情况:当输入数字索引切片时,类似于普通列表切片;当输入标签切片时,执行范围查询(即无需切片首末值存在于标签列中),包含两端标签结果,无匹配行时返回为空 isin/notin,条件范围查询,即根据特定列值是否存在于指定列表返回相应的结果 where,仍然是执行条件查询,但会返回全部结果,只是将不满足匹配条件的结果赋值为NaN或其他指定值,可用于筛选或屏蔽值 尤为强大的是,除了常用的字符串操作方法,str属性接口中还集成了正则表达式的大部分功能,这使得pandas在处理字符串列时,兼具高效和强力。例如如下代码可用于统计每个句子中单词的个数 ? 时间类型向量化操作,如字符串一样,在pandas中另一个得到"优待"的数据类型是时间类型,正如字符串列可用str属性调用字符串接口一样,时间类型列可用dt属性调用相应接口,这在处理时间类型时会十分有效。
],"Surname": [" Zhao ","Qian"," Sun " ]}) 3 #将ID列的类型转化为字符串的格式 4 df["ID"].astype(str) ? : [" Zhao ","Qian"," Sun " ]}) 3 #需要将ID列的类型转换为字符串, 否则无法使用slice()函数 4 df["ID"]= df["ID"].astype(str) 5 字段的拆分 使用split()函数进行字段的拆分, split(pat=None, n = -1, expand=True)函数包含三个参数: 第一个参数则是分隔的字符串, 默认是以空格分隔 第二个参数则是分隔符使用的次数 , 默认分隔所有 第三个参数若是True, 则在不同的列展开, 否则以序列的形式显示. 1 import pandas as pd 2 df = pd.DataFrame({"ID": [100000,100101,100201 以上是部分内容, 还会持续总结更新....
as np np.sqrt(df['总价']) 合并两字符串 df['朝向'] + df['户型'] 将新计算的均价存入DataFrame df['均价'] = df['总价'] * 1000 / df 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。 :表示前面匹配的字符出现了0次或者1次 r =”\d+”:表示前面匹配的字符出现了1次或者多次 #范围匹配 分组匹配方式:将多个匹配字符当成一个完整的匹配公式 (abc):用于在目标字符串中查询abc 从指定的字符串中直接进行查询,查询到的第一个结果作为匹配结果 pattern.findall(str):从指定的字符串中,查询符合匹配规则的字符,将所有符合的字符存放在一个列表中 pattern.finditer (str):从指定的字符串中,查询符合匹配规则的字符保存在一个可以迭代的对象中 pattern.sub():替换 pattern.split():拆分 eg: import re email = 'zhiji
对于更为复杂的模式匹配和文本操作,则可能需要用到正则表达式。pandas对此进行了加强,它使你能够对整组数据应用字符串表达式和正则表达式,而且能处理烦人的缺失数据。 正则表达式 正则表达式提供了一种灵活的在文本中搜索或匹配(通常比前者复杂)字符串模式的方式。正则表达式,常称作regex,是根据正则表达式语言编写的字符串。 findall返回的是字符串中所有的匹配项,而search则只返回第一个匹配项。match更加严格,它只匹配字符串的首部。 None,因为它只匹配出现在字符串开头的模式: In [159]: print(regex.match(text)) None 相关的,sub方法可以将匹配到的模式替换为指定字符串,并返回所得到的新字符串 (传入lambda表达式或其他函数)各个值,但是如果存在NA(null)就会报错。
在pandas 1.0版本之前,object是唯一的文本类型,在一列数据中如果包含数值和文本等混合类型则一般也会默认为object。 在pandas 1.0 版本之后,新增了string文本类型,可以更好的支持字符串的处理。 1.1. 类型简介 默认情况下,object仍然是文本数据默认的类型。 文本拼接 文本拼接是指将多个文本连接在一起,基于str.cat()方法 比如,将一个序列的内容进行拼接,默认情况下会忽略缺失值,我们亦可指定缺失值 连接一个序列和另一个等长的列表,默认情况下如果有缺失值 比如下面这个案例,我们用正则表达式将文本分为两部分,第一部分是字母a和b,第二部分匹配数字: 在上述案例中,expand参数为Fasle时如果返回结果是一列则为Series,否则是Dataframe。 P<列名称>,具体如下: 提取全部匹配项,会将一个文本中所有符合规则的内容匹配出来,最后形成一个多层索引数据: 我们还可以从字符串列中提取虚拟变量,例如用"|"分隔(第一行abc只有a,第二行有a和
01 字符串接口——str 在Pandas中,当一列数据类型均为字符串类型时,则可对该列执行属性接口操作,即通过调用.str属性可调用一系列的字符串方法函数,其中这里的字符串方法不仅涵盖了Python中内置的字符串通用方法 ,比如split、strim等,还实现了正则表达式的绝大部分功能,包括查找、匹配和替换等、这对于Pandas处理文本数据来说简直是开挂一般的存在。 ,其中lower是Python字符串内置的通用方法,replace虽然是Pandas中的全局方法,但嵌套了一层str属性接口后即执行正则匹配的替换,这里即用到了正则表达式的匹配原则,即对a-z字母以外的其他字符替换为空字符 针对这一需求,也可轻松实现两种解决方案,其中之一是进行拆分然后获取拆分后列表的长度、第二种是直接对字符串中空格进行计数,而后+1即为总的部下人数。两种方案结果是一致的: ? ---- 至此,Pandas应用小技巧系列文章已经推出了大部分,后续将视情整理一篇合集,敬请期待。
pd.Timestamp(),时间戳对象,从其首字母大写的命名方式可以看出这是pandas中的一个类,实际上相当于Python标准库中的datetime的定位,在创建时间对象时可接受日期字符串、时间戳数值或分别指定年月日时分秒等参数三类 举例如下: 1.首先创建数据结构如下,其中初始dataframe索引是时间序列,两列数据分别为数值型和字符串型 ? 2.运用to_datetime将B列字符串格式转换为时间序列 ? 当然,虽然同样是执行的模糊匹配,但对于时间序列和字符串序列的匹配策略还是略有不同:时间序列执行的模糊匹配是"截断式",即只要当前匹配,则进行筛选保留;而字符串序列执行的模糊匹配是"比较式",也就是说在执行范围查询时实际上是将各索引逐一与查询范围进行比较字符串大小 这里补充一个将时间序列索引转化为字符串格式的普通索引后的模糊匹配例子,可自行体会下二者的区别: ? ,无论是上采样还是下采样,其采样结果范围是输入记录中的最小值和最大值覆盖的范围,所以当输入序列中为两段不连续的时间序列记录时,可能会出现中间大量不需要的结果(笔者亲历天坑),同时在上图中也可发现从4小时上采样为
扫码关注云+社区
领取腾讯云代金券