SQL查询生成的DataFrame在Jupyter运行正常但IDLE/VS Code中为空
问题核心原因
你遇到的运行差异本质是运行环境的上下文差异:
- Jupyter Notebook 运行时共用同一个内核上下文,你提前执行过的SQL拉取生成
allData的代码会保留在内存中,调用selected()函数时可以正常读取到allData的内容 - IDLE/VSCode 运行单脚本时是独立的进程上下文,如果你的脚本里没有包含从SQL拉取数据生成
allData的代码,或者拉取逻辑执行失败,allData为空/未定义,后续筛选自然返回空DataFrame
具体解决步骤
- 补全脚本的前置逻辑:把你在Jupyter里用来从SQL拉取数据生成
allData的代码,放到脚本的最开头,确保调用selected()函数之前,allData已经完成初始化且有有效数据。可以在selected()函数第一行加print(allData.head(), allData.shape)验证,如果输出行数为0,说明数据拉取环节本身有问题,优先排查数据库连接、查询语句是否正确。 - 修复hID数据类型不匹配问题:
input()函数返回的永远是字符串类型,如果allData里的hID字段是整数类型,用@managerID查询时会因为类型不一致匹配不到数据,把输入的managerID转成对应类型即可:
# 原代码 managerID = input('Pick/Type in an MANAGER list ID ("hID") From the List Above: ') # 修改为(如果hID是整数类型) managerID = int(input('Pick/Type in an MANAGER list ID ("hID") From the List Above: '))
- 替换废弃的
append方法:pandas 2.0+已经正式移除了DataFrame.append方法,替换为pd.concat避免版本兼容问题,注意不要重置索引(你的索引是日期,后续分组要用到):
# 原代码 managerReturns = managerReturns.append(manager) # 修改为 managerReturns = pd.concat([managerReturns, manager], ignore_index=False)
- 加调试定位:在筛选manager的代码后加打印,确认是否能筛选到数据:
manager = allData.query('hID == @managerID') print("当前hID筛选到的记录行数:", len(manager)) # 如果输出0就是hID匹配的问题
内容的提问来源于stack exchange,提问作者Herman L
相关产品推荐
相关产品推荐

