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

