背景:疫情期間,社區(qū)團(tuán)購太過火爆,微信接龍信息登記雜亂無序,手動(dòng)整理非常費(fèi)時(shí),不便于后續(xù)匯總各居委樓棟訂購量以安排配送。親身經(jīng)歷——這兩天團(tuán)雞蛋接龍接了將近2天……結(jié)束后志愿者處理統(tǒng)計(jì)數(shù)據(jù)到凌晨兩點(diǎn)……我想python也許可以解決這個(gè)問題。
案例場景還原——
微信接龍?jiān)紨?shù)據(jù)填寫存在的問題:
(1)信息缺失,漏行or重復(fù)錄入。
(2)信息字段順序個(gè)人填寫不一致。
如A填:"X盒 XX弄XX室 姓名 手機(jī)"
B填“姓名 手機(jī) X盒 XX弄XX室 ”,
填寫信息順序不一致的話,在excel中使用分列也很難處理
(3)填寫格式不一致。
如“XX弄XX樓XX室” vs “XX-XX-XX”
Python數(shù)據(jù)處理——用正則匹配摘出字段信息,信息存入數(shù)據(jù)框再寫入excel。
步驟1:將接龍后的純文本以單列形式存儲(chǔ)在文件input.xlsx的Sheet1中
步驟2:python讀數(shù)據(jù)
import pandas as pd
infname='input.xlsx'
inputdata='Sheet1'
df=pd.read_excel(infname,inputdata,header=None)
df.columns=['line']
df.head(5)
步驟3:正則匹配地址、手機(jī)號碼
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')
#手機(jī)號碼匹配
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,'.')
#數(shù)量匹配
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,'')
#地址匹配-小區(qū)|路|公寓
pattern5=re.compile(r'[\u4E00-\u9FA5]{2}(?:小區(qū)|路|大樓|公寓)',re.X)
addrtxt1=''.join(pattern5.findall(line))
addr1.append(addrtxt1)
df['姓名']=pd.Series(name)
df['區(qū)域']=pd.Series(addr1)
df['樓弄']=pd.Series(addr2)
df['室']=pd.Series(addr3)
df['手機(jī)號碼']=pd.Series(phone)
df['數(shù)量']=pd.Series(num)
df.head(100)
處理后展示結(jié)果如下:
備注:line列為原始數(shù)據(jù)
步驟4:寫入excel,生成一個(gè)output.xlsx的excel文件,名為output的sheet中存放著處理過的數(shù)據(jù)
outfname='output.xlsx'
outputdata='output'
writer=pd.ExcelWriter(outfname)
df.to_excel(writer,outputdata)
writer.save()
打開生成的excel查看結(jié)果如下,接著就可以按樓弄排序,讓大家對照著核對最終信息(比如重復(fù)寫了但是兩次填寫數(shù)量不一致的、沒有寫數(shù)量的之類),需要注意僅留一個(gè)人收口變更信息。后續(xù)派發(fā)的時(shí)候志愿者就可以根據(jù)樓棟集中配送了。
備注:line列為原始數(shù)據(jù)