基于表格中的地址提取出相应的省份列、城市列信息。
1、目的:以下两个表分别是原始数据和需要提取的省市信息的结果。
2、过程(模糊匹配需要中国各省市对应关系表来辅助):
①分别读取地址表格和辅助表(中国各省市对应表)。
注:中国各省市对应表涵盖了最新最全的我国省市对应关系;
其中province为我国34个省、直辖市、自治区,match1是对应的序号(有用);city为我国目前377个地级市、直 辖市,province_city是city所属的省、直辖市、自治区,match2是对应的序号。
import numpy as np
import pandas as pd
columns_types={"province":str,"match1":int,"city":str,"match2":int}
df0=pd.read_excel(r"C:\Users\E97\Desktop\城市分布\地址表格.xlsx",sheet_name="地址")
da=pd.read_excel(r"C:\Users\E97\Desktop\城市分布\中国各省市对应表.xlsx",
sheet_name="省-市",converters=columns_types,engine="openpyxl")
②提取原始表的地址列,并添加地址对应的序号列,做一张大表(DataFrame元组)。
df1=df0["收货地址"]
df_count=df1.count()
senid=pd.DataFrame(np.arange(df_count))
df=pd.concat([senid,df1],axis=1)
df_sentence=df.rename(columns={0:"senid","收货地址":"sentence"})
③创建中国各省市对应表中city的小表(字典形式)。
#城市小表
da_city=da[["city","match2"]].dropna(how="any")
da_province=da[["province_city","city"]].dropna(how="any")
#小表变字典
key_city_dict={
row.city : row.match2
for row in da_city.itertuples()
}
key_city_dict
④大表遍历小表的字典(目的是匹配到city对应的序号match2)。
# 大表搜寻小表字典
import re
def merge_func(row):
# 新增一列,表示能匹配的match1
row["keyid_city"]=[
match2
for city,match2 in key_city_dict.items()
if re.search(city,row["sentence"])
]
return row
df_merge=df_sentence.apply(merge_func,axis=1)
⑤用match2映射对应的city。
df_city=pd.merge(
left = df_merge.explode("keyid_city"),
# left = df_merge.explode("keyids"), 此处explode是将df_merge一行中的多个keyids展开成多行
right = da_city,
how="left",
left_on = "keyid_city",
right_on = "match2",
)
df_city
⑥用city映射对应的省份。
df_province=pd.merge(
left=df_city,
right=da_province,
how="left",
on="city"
)
⑦提取目标列信息。
df_columns=["senid","sentence","province_city","city"]
df_result=df_province.loc[:,df_columns]
df_result.rename(columns={'senid':'序号','sentence':'原地址'},inplace=True)
df_result.to_excel(r"C:\Users\E97\Desktop\城市分布\匹配结果.xlsx",sheet_name="结果")
⑧完整代码附下:
注:可以通过自定义模块来直接调用函数多次提取地址信息(已完成)。
import numpy as np
import pandas as pd
columns_types={"province":str,"match1":int,"city":str,"match2":int}
df0=pd.read_excel(r"C:\Users\E97\Desktop\城市分布\地址表格.xlsx",sheet_name="地址")
da=pd.read_excel(r"C:\Users\E97\Desktop\城市分布\中国各省市对应表.xlsx",
sheet_name="省-市",converters=columns_types,engine="openpyxl")
# 大表
df1=df0["收货地址"]
df_count=df1.count()
senid=pd.DataFrame(np.arange(df_count))
df=pd.concat([senid,df1],axis=1)
df_sentence=df.rename(columns={0:"senid","收货地址":"sentence"})
#城市小表
da_city=da[["city","match2"]].dropna(how="any")
da_province=da[["province_city","city"]].dropna(how="any")
#小表变字典
key_city_dict={
row.city : row.match2
for row in da_city.itertuples()
}
key_city_dict
# 大表搜寻小表字典
import re
def merge_func(row):
# 新增一列,表示能匹配的match1
row["keyid_city"]=[
match2
for city,match2 in key_city_dict.items()
if re.search(city,row["sentence"])
]
return row
df_merge=df_sentence.apply(merge_func,axis=1)
df_merge.head()
df_city=pd.merge(
left = df_merge.explode("keyid_city"),
# left = df_merge.explode("keyids"), 此处explode是将df_merge一行中的多个keyids展开成多行
right = da_city,
how="left",
left_on = "keyid_city",
right_on = "match2",
)
df_city.head()
df_province=pd.merge(
left=df_city,
right=da_province,
how="left",
on="city"
)
df_columns=["senid","sentence","province_city","city"]
df_result=df_province.loc[:,df_columns]
df_result.rename(columns={'senid':'序号','sentence':'原地址'},inplace=True)
df_result.to_excel(r"C:\Users\E97\Desktop\城市分布\匹配结果.xlsx",sheet_name="结果")