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

Pandas merge传递双字段主键变量失败,手动赋值正常求助

Pandas merge左连接KeyError问题解决

问题场景

已成功连接DB2与Oracle数据库,两个库的查询均返回正常结果。获取到由两个字段组成的主键后,尝试将其作为变量传入pd.merge的on参数实现左连接,触发KeyError: "'ID','VER'";但手动写入['ID','VER']时merge可正常运行。

错误原因

你通过正则处理后得到的connectDB2.content_new3是一个字符串:"'ID','VER'",而pd.merge的on参数要求传入的是字段名组成的列表(比如['ID','VER'])。此时Pandas会把整个字符串"'ID','VER'"当作单个列名去DataFrame中查找,显然不存在这个列,因此抛出KeyError。

解决方案

不需要用正则给字段名添加引号,直接将DB2查询到的主键字段串拆分成字符串列表即可。
假设从DB2的syscat.INDEXES中查到的COLNAMES值格式为ID+VER(用+分隔多个主键字段),直接用split('+')拆分就能得到符合要求的列表。

修改后代码

import ibm_db
import ibm_db as db
import ibm_db_dbi
import pandas as pd
import cx_Oracle


def connectDB2():
    arg1 = "DATABASE=...;HOSTNAME=...;PORT=...;UID=...;PWD=...;"
    conn = db.connect(arg1, "", "")
    if conn:
        print('connection success')
        # Run SQL获取表数据
        sql_generic = "SELECT distinct 'select ' || LISTAGG(COLNAME,', ') || '  from ' || trim(TABSCHEMA) || '.' || tabname || ' FETCH FIRST 2 ROWS ONLY' FROM SYSCAT.columns WHERE TABSCHEMA = '...' AND TABNAME = '...' AND COLNAME NOT IN ('CDC_STATUS','CDC_ODS_UPD') GROUP BY TABSCHEMA, TABNAME"
        stmt = ibm_db.exec_immediate(conn, sql_generic)
        result = ibm_db.fetch_both(stmt)

        conn1 = ibm_db_dbi.Connection(conn)
        connectDB2.df = pd.read_sql(result['1'], conn1)

        print('df', connectDB2.df)

        # 查询主键字段
        sql_PK = "SELECT COLNAMES FROM syscat.INDEXES WHERE TABSCHEMA='...' AND TABNAME = '...' AND UNIQUERULE='P'"
        conn2 = ibm_db_dbi.Connection(conn)
        connectDB2.df1 = pd.read_sql(sql_PK, conn2)
        print('pk', connectDB2.df1)
        d = connectDB2.df1.loc[:, "COLNAMES"]
        print('d', d)
        print('d0', d[0])

        # 直接拆分字段为列表,替代原来的正则处理
        connectDB2.pk_columns = d[0].split('+')
        print('pk_columns', connectDB2.pk_columns)  # 输出: ['ID', 'VER']
    else:
        print('connection failed')


def connectOracle():
    con = cx_Oracle.connect('...')
    orders_sql = """select ...  from ... FETCH FIRST 2 ROWS ONLY"""
    connectOracle.df_orders = pd.read_sql(orders_sql, con)
    print(connectOracle.df_orders)


def leftJoin():
    # 使用列表作为on参数
    df1 = pd.merge(connectOracle.df_orders, connectDB2.df, on=connectDB2.pk_columns, how='left')
    print(df1)


connectDB2()
connectOracle()
leftJoin()

验证说明

修改后,connectDB2.pk_columns是一个字符串列表,符合pd.merge的on参数要求,Pandas会正确识别这两个字段作为连接键进行左连接,不会再抛出KeyError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:48:27