重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Python之所以能够成为流行的数据分析语言,有一部分原因在于其简洁易用的字符串处理能力。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、虚拟主机、营销软件、网站建设、平房网站维护、网站推广。
Python的字符串对象封装了很多开箱即用的内置方法,处理单个字符串时十分方便;对于Excel、csv等表格文件中整列的批量字符串操作,pandas库也提供了简洁高效的处理函数,几乎与内置字符串函数一一对应。也就是说:
单个字符串处理,用Python内置的字符串方法;
表格整列的字符串处理,用pandas库中的字符串函数;
本文就以常用的数据处理需求,来对比使用以上两种方式的异同,从而加深对Python
和pandas
字符串操作的理解。(本文所有数据都是为了演示用的假数据,切勿当真!)
)
场景:在问卷收集的姓名字段中,不少填写者会误输入空格,造成数据匹配不一致的问题。
names='刘备、关羽、张飞、赵云、马超、黄忠'
names=names.replace('','')
print(names)
output
刘备、关羽、张飞、赵云、马超、黄忠
df['姓名']=df['姓名'].str.replace('','')
output
场景:在问卷收集数据的时候,多选题的数据往往是带有分隔符的。在分类汇总前往往需要按分隔符进行分列。
hobbyStr="足球┋排球┋羽毛球┋篮球"
hobbyList=hobbyStr.split('┋')
output
['足球','排球','羽毛球','篮球']
#利用split进行分列,expand=True返回dataframe;expand=False返回Series
hobbyDf=df['爱好'].str.split('|',expand=True)
#将hobbyDf与df安装索引合并
df2=pd.merge(df,hobbyDf,how="left",left_index=True,right_index=True)
字符串是由一个个字符组成的序列,在Python中可以直接对字符串进行切片操作,来进行截取数据。
如“XX市四季家园二区22幢203室”,可以看作是下图中16个字符值组成的序列。而切片的语法是:
addressStr="XX市四季家园二区22幢203室"
print(f"城市:{addressStr[:3]}")
print(f"小区:{addressStr[3:9]}")
output
城市:XX市
小区:四季家园二区
df["城市"]=df["地址"].str[:3]
正则表达式
。详细处理方法,见下文五、正则表达式
示例1。有时候,我们在电脑中按文件名排序的时候,你可能会遇到下面的情况:
在不同系统中,我们希望是按数值排序,但偏偏系统却是按字符排序的,如某些车载播放器中。比较好的解决方法就是在前面添加0,补齐数据位数。数据量大的时候,手动修改很麻烦,Python字符串处理的zfill()
函数就可以解决这个问题。
myStr="1章节"
print(myStr.zfill(4))#整个字符串补齐到4位
output
01章节
df["新文件名"] = "第"+df["文件名"].str[1:].str.zfill(8)
配合os.rename()
便可以批量重命名。关键代码如下
df.apply(lambdax:os.rename(path+x["文件名"],path+x["新文件名"]),axis=1)
遇到复杂的字符串处理需求时,Python有优势就可以体现出来了。因为python和pandas有一个超强的字符串处理武器:正则表达式。正则表达式可以匹配字符串的格式特点,如电子邮箱的地址格式、网址的地址格式、电话号码格式等。如何写好正则表达式,这是一门精深的学问,本文介绍几个正则表达式的常用案例,浅尝辄止。
注:Python默认不支持正则表达式语法,而pandas直接支持正则表达式语法,这里重点介绍pandas处理表格数据。
思路:
提取上面小区名,可以归纳一下地址中小区名的格式特点:苏州市之后,幢号数字之前的中文字符
。
Series
的str.extract()
,可用正则从字符数据中抽取匹配的数据;
##匹配中文字符的正则表达式:[\u4e00-\u9fa5]
pattern=r'苏州市([\u4e00-\u9fa5]+)[0-9]+幢'
df["小区"]=df["地址"].str.extract(pattern,expand=False)
思路:几幢几室,格式都是数字+幢
和数字+室
[0-9]
或\d
来匹配;+
表示1个或多个。pattern=r'([0-9]+)幢'
df["幢号"]=df["地址"].str.extract(pattern,expand=False)
pattern=r'(\d+)室'
df["室号"]=df["地址"].str.extract(pattern,expand=False)
apply 函数:可以对DateFrame
进行逐行或逐列进行处理。
将幢号为奇数的为A区,偶数的为B区
#定义处理的函数,共apply函数调用,传入的参数为一个Series对象
defmy_func(series):
if(series["幢号"])%2!=0:
return"A区"
else:
return"B区"
df["幢号分类"]=df.apply(my_func,axis=1)
上述代码中apply函数,有两个参数
my_func
;axis = 1
,表示按列处理。即传入的是每一行的Series
。output
defmy_func2(series):
#映射字典,key为小区名,value为小区称号
my_dict={
'吉祥如意家园':'最佳好运小区',
'科技村':'最佳科创小区',
'四季家园':'最佳风光小区',
'万象更新家园':'最佳风采小区',
}
#每一行小区名称,切片截取至倒数第2个,即-2
nameKey=series['小区'][:-2]
returnmy_dict[nameKey]
df["小区称号"]=df.apply(my_func2,axis=1)
output
本文演示的字符串操作:替换
、分列
、切片截取
、补齐数据
、正则表达式
、apply()函数
常见于数据分析的数据清洗环节,替换
、分列
、切片截取
在Excel中也很容易实现,正则表达式
可以说是Python处理复杂字符串问题的一大利器,apply()函数
可以实现自定义函数
处理表格型的数据,十分灵活、威力巨大。由于篇幅有限,正则表达式
、apply()函数
本文就点到为止,今后值得整理更多相关案例。