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

pandas按匹配字段合并两个DataFrame结果异常如何解决

问题根因

你代码里有4个直接导致关联失败的错误:

  • 关联键指定错误:merge时right_on参数传了'CITY',完全不是需要匹配的BID字段,拿设备池编号(如098)去匹配城市名称(如Dadilville),不可能匹配成功,所以关联字段全为NaN
  • 过滤逻辑无效:dff.iloc[:0]选取的是0行的空数据切片,后续的正则匹配规则根本没有作用到实际数据上
  • 字段类型不匹配:两个关联字段Device Pool和BID都是数字格式的编号,pandas默认读取csv时会把这类字段解析为整数,前导零会丢失(比如字符串'098'会被转成整数98),两边格式不一致就会匹配失败
  • 变量引用错误:读取位置参考表时存为df_loc,后续过滤字段时却调用了dfk,如果没有提前定义dfk会直接报错,就算提前定义了也不是你刚读取的位置表数据
正确实现代码
import pandas as pd

# 读取数据时强制指定关联键为字符串类型,保留前导零
df1 = pd.read_csv(source_file, low_memory=False, dtype={'Device Pool': str})
df_loc = pd.read_csv(path_loc, dtype={'BID': str})

# 只保留需要用到的字段
dff = df1[['Device Pool', 'Directory Number 1']].copy()
df_ref = df_loc[['BID', 'ADDRESS', 'CITY']].copy()

# 如果Device Pool字段带B前缀(如B098),执行正则提取纯数字部分;如果本身就是纯数字编号,这步可跳过
dff['Device Pool'] = dff['Device Pool'].str.replace(r'.*B(\d+).*', r'\1', regex=True)

# 执行左连接,左表为df1处理后的数据,右表为位置参考表,关联键分别为Device Pool和BID
result = dff.merge(df_ref, left_on='Device Pool', right_on='BID', how='left')

# 关联后多余的BID字段可以删除
result = result.drop(columns=['BID'])
排查建议

如果执行后仍有部分记录关联字段为NaN,运行以下代码提取未匹配的设备池编号,核对位置参考表中是否存在对应BID即可:

# 输出所有未匹配到地址的Device Pool值
unmatched_pools = result[result['ADDRESS'].isna()]['Device Pool'].unique()
print("未匹配的设备池编号:", unmatched_pools)

内容的提问来源于stack exchange,提问作者OrkyCodes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:36:20