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

Python pandas合并多表时ngaybaoluu列无值但同逻辑SQL内连接正常

问题原因
  • 列名冲突导致取到空值列:history表大概率也存在ngaybaoluu字段且值全为空,第一次合并history_value和history时,虽然设置了('_left','_right')后缀,但你没有提前核对合并后的列名,直接选取ngaybaoluu时,实际匹配到的是无后缀的空列(或是第二次和hocvien合并时生成的重名空列),没有取到来自history_value的有效列。
  • 冗余字段干扰逻辑对齐:你读取三张表时没有提前剔除无关字段,三张表都存在hv_id等同名字段,合并时会生成多个带后缀的重名列,很容易出现选列、关联的逻辑错位,和你写的SQL(仅取需要字段关联)逻辑不一致。
  • 日期字段默认解析异常:ngaybaoluu是日期类型字段,pandas默认读取JSON时,如果遇到格式不兼容的日期、空字符串,会自动转换为NaN空值,视觉上和整列无有效值一致。
修复方案

按以下规则调整代码即可:

  1. 读取每张表后仅保留后续需要用到的字段,提前剔除冗余的同名字段,避免合并时出现无意义的重名列
  2. 对日期字段显式做类型转换,设置解析失败的报错规则,方便提前定位数据格式问题
  3. 合并逻辑严格对齐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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:33:26