背景:疫情期间,社区团购太过火爆,微信接龙信息登记杂乱无序,手动整理非常费时,不便于后续汇总各居委楼栋订购量以安排配送。亲身经历——这两天团鸡蛋接龙接了将近2天……结束后志愿者处理统计数据到凌晨两点……我想python也许可以解决这个问题。
案例场景还原——
微信接龙原始数据填写存在的问题:
(1)信息缺失,漏行or重复录入。
(2)信息字段顺序个人填写不一致。
如A填:"X盒 XX弄XX室 姓名 手机"
B填“姓名 手机 X盒 XX弄XX室 ”,
填写信息顺序不一致的话,在excel中使用分列也很难处理
(3)填写格式不一致。
如“XX弄XX楼XX室” vs “XX-XX-XX”
Python数据处理——用正则匹配摘出字段信息,信息存入数据框再写入excel。
步骤1:将接龙后的纯文本以单列形式存储在文件input.xlsx的Sheet1中
步骤2:python读数据
import pandas as pd
infname='input.xlsx'
inputdata='Sheet1'
df=pd.read_excel(infname,inputdata,header=None)
df.columns=['line']
df.head(5)
步骤3:正则匹配地址、手机号码
import re
name=[]
addr=[]
addr1=[]
addr2=[]
addr3=[]
phone=[]
num=[]
for i in range(len(df.index)):
line=str(df.loc[i,'line'])
line=line[line.find('.')+1:]
line=line.replace('一','1').replace('零','0').replace('O','0').replace('七','7')
#手机号码匹配
pattern1=re.compile(r'[1l][345789]\d{9}',re.X)
phonetxt=''.join(pattern1.findall(line))
phone.append(phonetxt)
if len(phonetxt)==11:
line=line.replace(phonetxt,'.')
#数量匹配
pattern2=re.compile(r'[\d]+(?:箱|盒)',re.X)
numtxt=''.join(pattern2.findall(line))
num.append(numtxt)
if len(numtxt)>=1:
line=line.replace(numtxt,'')
#昵称匹配
line=re.sub(r'[\s+|,|,|.]+','.',line)
line=line.strip('.')
nametxt=line[:line.find('.')]
name.append(nametxt)
#地址匹配-弄号室
line=re.sub(r'[栋|号楼]','号',line)
line=line.replace('弄-','弄').replace('号-','号')
pattern3=re.compile(r'[\d]+(?:-|弄|号)',re.X)
addrtxt2=''.join(pattern3.findall(line))
addr2.append(addrtxt2.strip('-'))
if len(addrtxt2)>=1:
line=line.replace(addrtxt2.strip('-').strip('号'),'')
#地址匹配-室
pattern4=re.compile(r'[号|-][\d]+',re.X)
addrtxt3=''.join(pattern4.findall(line)).strip('号').strip('室').strip('-')
addr3.append(addrtxt3)
if len(addrtxt3)>=1:
line=line.replace(addrtxt3,'')
#地址匹配-小区|路|公寓
pattern5=re.compile(r'[\u4E00-\u9FA5]{2}(?:小区|路|大楼|公寓)',re.X)
addrtxt1=''.join(pattern5.findall(line))
addr1.append(addrtxt1)
df['姓名']=pd.Series(name)
df['区域']=pd.Series(addr1)
df['楼弄']=pd.Series(addr2)
df['室']=pd.Series(addr3)
df['手机号码']=pd.Series(phone)
df['数量']=pd.Series(num)
df.head(100)
处理后展示结果如下:
步骤4:写入excel,生成一个output.xlsx的excel文件,名为output的sheet中存放着处理过的数据
outfname='output.xlsx'
outputdata='output'
writer=pd.ExcelWriter(outfname)
df.to_excel(writer,outputdata)
writer.save()
打开生成的excel查看结果如下,接着就可以按楼弄排序,让大家对照着核对最终信息(比如重复写了但是两次填写数量不一致的、没有写数量的之类),需要注意仅留一个人收口变更信息。后续派发的时候志愿者就可以根据楼栋集中配送了。