You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于街道与门牌号匹配填充DataFrame缺失邮编遇函数失效问题

搞定DataFrame间地址匹配填充缺失邮编的问题

我来帮你解决这个头疼的问题!首先先把你的模拟数据补全,同时咱得有一个带完整地址和对应邮编的参考数据集(毕竟你得从这里提取邮编来填充嘛):

import pandas as pd
import numpy as np

# 你的目标DataFrame(有缺失邮编)
sufixo = ['ST', 'ST', 'AV', 'ST', 'AV']
logradouro = ['JEFF', '9TH', 'CRAZY', 'SEXY', 'TEST']
number = [123, 444, 1204, 40, 55]
zipcode = [None, None, None, None, None]
target_df = pd.DataFrame({
    'sufixo': sufixo,
    'logradouro': logradouro,
    'number': number,
    'zipcode': zipcode
})

# 构造参考DataFrame(假设这是你用来匹配的数据源)
source_sufixo = ['ST', 'ST', 'AV', 'ST', 'AV', 'ST']
source_logradouro = ['JEFF', '9TH', 'CRAZY', 'SEXY', 'TEST', 'JEFF']
source_number = [123, 444, 1204, 40, 55, 125]
source_zipcode = ['90210', '10001', '94103', '60601', '78701', '90210']
source_df = pd.DataFrame({
    'sufixo': source_sufixo,
    'logradouro': source_logradouro,
    'number': source_number,
    'zipcode': source_zipcode
})

为啥硬编码参数有效,动态调用就不行?

这种情况十有八九是函数参数传递的方式不对,或者你用apply的时候没搞对姿势——比如没有把每行的sufixo、logradouro、number正确传给函数,导致它没法正常匹配。

解决方案:正确用apply传递行参数

咱先写个匹配函数,然后用apply逐行把参数传进去,从参考数据里捞出对应的邮编:

1. 写个靠谱的匹配函数

这个函数接收每行的地址信息,先尝试精确匹配,实在不行再搞模糊匹配,灵活度拉满:

def get_matching_zip(sufixo, logradouro, number, source_df):
    # 先搞精确匹配:后缀、街道名、门牌号全对上
    exact_match = source_df[
        (source_df['sufixo'] == sufixo) &
        (source_df['logradouro'] == logradouro) &
        (source_df['number'] == number)
    ]
    if not exact_match.empty:
        # 有精确匹配就直接返回第一个邮编
        return exact_match['zipcode'].iloc[0]
    else:
        # 没精确匹配的话,试试只匹配街道(忽略门牌号差异)
        street_match = source_df[
            (source_df['sufixo'] == sufixo) &
            (source_df['logradouro'] == logradouro)
        ]
        if not street_match.empty:
            # 返回这条街道最常用的邮编
            return street_match['zipcode'].mode().iloc[0]
        # 啥匹配都没有,就返回NaN
        return np.nan

2. 用apply逐行填充缺失值

这里关键是加axis=1让apply逐行处理,再用lambda把每行的参数传给函数,别传错了:

target_df['zipcode'] = target_df.apply(
    lambda row: get_matching_zip(
        row['sufixo'], 
        row['logradouro'], 
        row['number'], 
        source_df
    ),
    axis=1
)

3. 看看效果

执行完之后打印target_df,就能看到缺失的邮编都被填上了:

print(target_df)

输出大概是这样:

sufixo logradouro  number zipcode
0     ST        JEFF     123   90210
1     ST         9TH     444   10001
2     AV       CRAZY    1204   94103
3     ST        SEXY      40   60601
4     AV        TEST      55   78701

踩坑排查指南

  • 如果还是不行,先在函数里加个print(sufixo, logradouro, number),看看传入的参数对不对——说不定是列名拼错了!
  • 确认参考DataFrame和目标DataFrame的列名完全一致,别一个叫sufixo一个叫suffix,那肯定匹配不上。
  • 如果需要处理拼写差异的街道名,可以试试用字符串相似度算法(比如Levenshtein距离)来优化匹配逻辑。

内容的提问来源于stack exchange,提问作者Gabriel Montañola

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:17:13