当前位置: 首页 > 后端技术 > Python

Pandas进阶教程:处理文本数据

时间:2023-03-26 19:17:25 Python

简介在1.0之前,存储文本数据只有一种形式,那就是object。在1.0之后,添加了一种新的数据类型,称为StringDtype。今天给大家讲解一下Pandas里面的文中的东西。创建文本DF,首先看下使用文本构建DF的常见例子:In[1]:pd.Series(['a','b','c'])Out[1]:0a1b2cdtype:object如果你想使用新的StringDtype,你可以这样做:In[2]:pd.Series(['a','b','c'],dtype="string")Out[2]:0a1b2cdtype:stringIn[3]:pd.Series(['a','b','c'],dtype=pd.StringDtype())Out[3]:0a1b2cdtype:string或使用要转换的类型:In[4]:s=pd.Series(['a','b','c'])In[5]:sOut[5]:0a1b2cdtype:objectIn[6]:s.astype("string")Out[6]:0a1b2cdtype:stringStringmethod字符串可转换为大写、小写并计算其长度:In[24]:s=pd.Series(['A','B','C','Aaba','Baca',np.nan,'CABA','dog','cat'],....:dtype="string")....:In[25]:s.str.lower()Out[25]:0a1b2c3aaba4baca56caba7dog8catdtype:stringIn[26]:s.str.upper()Out[26]:0A1B2C3AABA4BACA56CABA7DOG8CATdtype:stringIn[27]:s.str.len()Out[27]:01112134445647383dtype:Int64也可以执行trip操作:In[28]:idx=pd.Index(['jack','jill','jesse','frank'])In[29]:idx.str.strip()Out[29]:Index(['jack','jill','jesse','frank'],dtype='object')In[30]:idx.str.lstrip()Out[30]:Index(['jack','jill','jesse','frank'],dtype='object')In[31]:idx.str.rstrip()Out[31]:Index(['jack','jill','jesse','frank'],dtype='object')列的字符串操作由于列是用String表示的,所以可以用普通的String方式对列进行操作:In[34]:df.columns.str.strip()Out[34]:Index(['ColumnA','ColumnB'],dtype='object')In[35]:df.columns.str.lower()Out[35]:Index(['columna','columnb'],dtype='object')In[32]:df=pd.DataFrame(np.random.randn(3,2),...:columns=['ColumnA','ColumnB'],index=range(3))....:In[33]:dfOut[33]:ColumnAColumnB00.469112-0.2828631-1.509059-1.13563221.212112-0.173215splitandreplaceStringSplit可以将一个String拆分成一个数组在[38]中:s2=pd.Series(['a_b_c','c_d_e',np.nan,'f_g_h'],dtype="string")在[39]中:s2.str.split('_')out[39]:0[a,b,c]1[c,d,e]23[f,g,h]dtype:object如果要访问拆分后的数组中的字符,你可以这样做:In[40]:s2.str.split('_').str.get(1)Out[40]:0b1d23gdtype:objectIn[41]:s2.str.split('_').str[1]Out[41]:0b1d23gdtype:object使用expand=True将拆分数组展开为多列:In[42]:s2.str.split('_',expand=True)Out[42]:0120abc1cde23fgh可以指定拆分列数:In[43]:s2.str.split('_',expand=True,n=1)Out[43]:010ab_c1cd_e23fg_hreplace用于替换字符,替换过程中也可以使用正则表达式:s3海峡replace('^.a|dog','XX-XX',case=False)字符串连接可以使用cat连接字符串:In[64]:s=pd.Series(['a','b','c','d'],dtype="string")In[65]:s.str.cat(sep=',')Out[65]:'a,b,c,d'使用.str到indexpd.Series将返回一个系列。如果Series是字符串,可以通过索引访问该列的字符。例如:在[99]中:s=pd.Series(['A','B','C','Aaba','Baca',np.nan,....:'CABA','dog','cat'],....:dtype="string")....:In[100]:s.str[0]Out[100]:0A1B2C3A4B56C7d8cdtype:stringIn[101]:s.str[1]Out[101]:0123a4a56A7o8adtype:stringextractExtract用于解压String中的数据,它接收一个expand参数,在0.23版本之前,这个参数默认为False,如果为false,extract会返回Series,index或者DF。如果expand=true,则返回DF。0.23版本之后,默认为true。extract通常与正则表达式一起使用。在[102]中:pd.Series(['a1','b2','c3'],....:dtype="string").str.extract(r'([ab])(\d)',expand=False).....:Out[102]:010a11b22上面的例子根据正则表达式分解了Series中的每一个字符串。第一部分是字符,第二部分是数字。请注意,只会提取正则表达式中组的数据。以下将仅提取数字:在[106]中:pd.Series(['a1','b2','c3'],.....:dtype="string").str.extract(r'[ab](\d)',expand=False)....:Out[106]:01122dtype:stringisok指定列名如下:In[103]:pd.系列(['a1','b2','c3'],.....:dtype="string").str.extract(r'(?P[ab])(?P\d)',.....:expand=False).....:Out[103]:letterdigit0a11b22extractall和extract类似extractall。不同之处在于extract只会匹配第一次,而extractall会进行所有匹配。例如:在[112]中:s=pd.Series(["a1a2","b1","c1"],index=["A","B","C"],.....:dtype="string").....:In[113]:sOut[113]:Aa1a2Bb1Cc1dtype:stringIn[114]:two_groups='(?P[a-z])(?P[0-9])'In[115]:s.str.extract(two_groups,expand=True)Out[115]:字母数字Aa1Bb1Cc1extract匹配a1后,就不再继续了。In[116]:s.str.extractall(two_groups)Out[116]:letterdigitmatchA0a11a2B0b1C0c1extractall会在匹配a1匹配a2后继续。contains和matchcontains和match用于测试DF是否包含特定数据:In[127]:pd.Series(['1','2','3a','3b','03c','4dx'],.....:dtype="string").str.contains(pattern).....:Out[127]:0False1False2True3True4True5Truedtype:booleanIn[128]:pd.Series(['1','2','3a','3b','03c','4dx'],.....:dtype="string").str.match(pattern).....:Out[128]:0False1False2True3True4False5Truedtype:booleanIn[129]:pd.Series(['1','2','3a','3b','03c','4dx'],.....:dtype="string").str.fullmatch(pattern).....:Out[129]:0False1False2True3True4False5Falsedtype:booleanString方法总结最后总结一下String方法:MethodDescriptioncat()Concatenatestringssplit()Splitstringsondelimiterrsplit()Splitstringsondelimiterworkingfromtheendofthestringget()Indexintoeachelement(retrievei-thelement)join()JoinstringsintheeachelementofSerieswithpassedseparation字符串拆分orget_dummies()在分隔符上拆分字符串返回虚拟变量的DataFramecontains()如果每个字符串包含pattern/regexreplace()返回布尔数组替换出现的pattern/regex/string为其他字符串或给定occurrencerepeat()重复值(s.str.repeat(3)等同于x*3)pad()在字符串的左、右或两边添加空格center()等同于str.centerljust()等同于str.ljustrjust()等同将str.rjustzfill()等同于str.zfillwrap()将长字符串分割成长度小于给定宽度的行slice()对Series中的每个字符串进行切片slice_replace()用传递的值替换每个字符串中的切片count()Countoccurrencesofpatternstartswith()等价于每个元素的str.startswith(pat)endswith()等价于每个元素的str.endswith(pat)findall()Computelistofalloccurrencespattern/regexforeachstringmatch()Callre.matchoneachelement,返回匹配组作为listextract()对每个元素调用re.search,返回DataFrame,每个元素一行,每个正则表达式捕获一列并且每个正则表达式捕获一列grouplen()计算字符串长度相当于str.lowercasefold()相当于str.casefoldupper()相当于str.upperfind()相当于str.findrfind()相当于str.rfindindex()相当于str.indexrindex()相当于str.rindexcapitalize()相当于str.capitalizeswapcase()相当于str.swapcasenormalize()返回Unicode范式。相当于unicodedata.normalizetranslate()相当于str.translateisalnum()相当于str.isalnumisalpha()相当于相当于str.isalphaisdigit()相当于str.isdigitisspace()相当于str.isspaceislower()相当于str.islowerisupper()相当于str.isupperistitle()相当于str.istitleisnumeric()相当于str.isnumericisdecimal()相当于str.isdecimal本文已收录于http://www.flydean.com/06-python-pandas-text/最流行的解读,最深刻的干货,最简洁的教程,很多你不会的小技巧知道都在等你发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!