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
相关产品推荐
相关产品推荐

