小案例(八):商户信息整理(python)
微信公众号:机器学习养成记
1、需求目的
本次小案例中,我们的样例数据是上海几家商户及其地址信息,其中地址信息包括市、区、具体门牌号,但所有信息均未进行拆分,因此无法对商户名称及地址信息进行更好的应用整理。原始数据如下👇
我们希望通过一系列整理,可以把数据拆分成商户名称、城市、区、详细地址的格式,并且将商户名称后面括号中的内容去掉,目标结果如下👇
2、 知识点
rfind():返回字符串最后一次出现的位置
根据官方给出的例子,我们要找到“is”最后出现的位置,“is”最后出现的地方前面分别是“t”,“h”,“i”,“s”,“ ”五个字符,最后出现的“is”位于第六个字符处,所以返回结果为5(python中第一个位置从0开始)。
str ="this is really a string example....wow!!!";
substr ="is";
print str.rfind(substr);
#输出结果为:5
正则表达式
python中的re模块可以通过正则表达式实现一系列的字符串匹配功能,其中re.sub()用于替换字符串中的匹配项,'\D'代表除数字以外的任意字符,官方示例中,展示了如何将所有的非数字字符替换为空(即去除所有非数字字符),在本次介绍的案例中我们也用此方法将商户名称后面()中的内容剔除掉。
import re
phone ="2004-959-559
# 这是一个电话号码"
# 移除非数字的内容
num = re.sub(r'\D',"", phone)
print(num)
#输出结果为:2004959559
3、python代码实现
下面是可以满足需求实现的python代码,主要实现逻辑是:用rfind()逐行进行切分,并通过正则表达式剔除商户名称后面()中内容,生成4个维度的列表;然后把列表整理成字典形式;最后转化为dataframe进行返回。
def organizedData(data):
# name : 商户名称
# city : 城市
# community : 区
# detail : 详细地址
name = []
city = []
community = []
detail = []
for line in range(0,data.shape[0]):
r = data.iloc[line,0].rfind('上海市')
d = data.iloc[line,0].rfind('区')
#将店名后面括号中的内容删掉
name.append(re.sub(r'\([\u4e00-\u9fa5a-zA-Z0-9]*\)','',data.iloc[line,0][0:r]))
city.append('上海市')
community.append(data.iloc[line,0][r+3:d+1])
detail.append(data.iloc[line,0][d+2:])
#将列表转换为字典,然后生成数据框
c = {"name": name,"city": city,"community":community,"detail":detail}
result = pd.DataFrame(c)
return result
公众号后台回复“整理”获得完整代码
微信公众号:机器学习养成记