通過Python正則匹配快速統(tǒng)計(jì)團(tuán)購接龍數(shù)據(jù)

背景:疫情期間,社區(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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容