Python pandas合并多表时ngaybaoluu列无值但同逻辑SQL内连接正常
问题原因
- 列名冲突导致取到空值列:
history表大概率也存在ngaybaoluu字段且值全为空,第一次合并history_value和history时,虽然设置了('_left','_right')后缀,但你没有提前核对合并后的列名,直接选取ngaybaoluu时,实际匹配到的是无后缀的空列(或是第二次和hocvien合并时生成的重名空列),没有取到来自history_value的有效列。 - 冗余字段干扰逻辑对齐:你读取三张表时没有提前剔除无关字段,三张表都存在
hv_id等同名字段,合并时会生成多个带后缀的重名列,很容易出现选列、关联的逻辑错位,和你写的SQL(仅取需要字段关联)逻辑不一致。 - 日期字段默认解析异常:
ngaybaoluu是日期类型字段,pandas默认读取JSON时,如果遇到格式不兼容的日期、空字符串,会自动转换为NaN空值,视觉上和整列无有效值一致。
修复方案
按以下规则调整代码即可:
- 读取每张表后仅保留后续需要用到的字段,提前剔除冗余的同名字段,避免合并时出现无意义的重名列
- 对日期字段显式做类型转换,设置解析失败的报错规则,方便提前定位数据格式问题
- 合并逻辑严格对齐SQL:
history_value和history通过ketoan_id内连,再用history表的hv_id和hocvien的hv_id内连
修正后的可运行代码:
from urllib.request import urlopen import pandas as pd import json import requests # 读取history_value表 req = requests.get('替换为你的history_value API地址') req_json = req.json() df = pd.DataFrame(json.loads(r['history_value']) for r in req_json) # 仅保留需要的字段,剔除冗余列避免重名 history_value = df[['ketoan_id', 'lydo', 'ngayhoclai', 'ngaybaoluu']].copy() # 显式解析日期字段,格式异常的值转为NaT方便排查 history_value['ngaybaoluu'] = pd.to_datetime(history_value['ngaybaoluu'], errors='coerce') history_value['ngayhoclai'] = pd.to_datetime(history_value['ngayhoclai'], errors='coerce') # 读取history表 response = urlopen('https://office.ieltsvietop.vn/api/get_data/history') history = pd.read_json(response) # 仅留关联和结果需要的字段 history = history[['ketoan_id', 'hv_id', 'action', 'object']].copy() # 读取hocvien表 response = urlopen('https://office.ieltsvietop.vn/api/get_data/hocvien') data_json = json.loads(response.read()) hocvien = pd.DataFrame(data_json) # 仅留关联和结果需要的字段 hocvien = hocvien[['hv_id', 'hv_fullname', 'hv_coso']].copy() # 第一次合并:对齐SQL中history_value和history的内连逻辑 merge_step1 = history_value.merge(history, on='ketoan_id', how='inner') # 第二次合并:对齐SQL中关联hocvien的逻辑 final_df = merge_step1.merge(hocvien, on='hv_id', how='inner') # 提取目标字段,此时无重名列冲突 result = final_df[['ngaybaoluu', 'ngayhoclai','lydo','hv_fullname','action', 'object', 'hv_coso']] display(result) print('Success')
如果调整后仍存在空值,可以先执行print(history_value['ngaybaoluu'].isna().sum())检查history_value读取阶段该字段是否已经为空,优先排查API返回数据的完整性问题。
内容的提问来源于stack exchange,提问作者Phạm Tấn Thành
相关产品推荐
相关产品推荐

