模糊匹配提取地址中的省市

基于表格中的地址提取出相应的省份列、城市列信息。
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"})

大表df_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小表
④大表遍历小表的字典(目的是匹配到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="结果")

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钢蛋小黑娃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值