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

Jupyter Notebook批量与单单元格运行结果不一致问题求助

Jupyter Notebook Run All 与单独运行单元格结果不一致的问题排查与解决

核心原因

这类问题几乎都是全局变量状态污染或单元格执行顺序混乱导致的——Jupyter的变量是全局生效的,手动单独运行单元格会打乱变量的初始状态,而Run All是严格按从上到下的顺序执行,两者的执行环境不一致就会出现结果差异。另外,代码中的冗余操作、逻辑错误也会放大这类问题。


问题1:日期筛选结果为空(Run All 失效,单独运行正常)

先看你的日期处理代码,多次冗余转换极易引入隐式错误:

df_m_dom['data/ora stato evento'] = pd.to_datetime(df_m_dom['data/ora stato evento'])
df_m_dom['data/ora stato evento'] = df_m_dom['data/ora stato evento'].dt.date
df_m_dom['data/ora stato evento'] = pd.to_datetime(df_m_dom['data/ora stato evento'])
df_m_dom['data/ora stato evento'] = df_m_dom['data/ora stato evento'].dt.strftime('%d/%m/%Y')
df_m_dom['data/ora stato evento'] = df_m_dom['data/ora stato evento'].astype(str)

df_m_dom['data/ora stato evento'] = pd.to_datetime(df_m_dom['data/ora stato evento'], errors='coerce')
df_filtrato_sett0 = df_m_dom[df_m_dom['data/ora stato evento'].between(inizio_settimana, fine_settimana)]

问题点:

  1. 多次类型转换导致的格式兼容问题:反复在datetime、date、字符串之间转换,容易丢失时间信息或引发解析错误,Run All时的初始数据状态和单独运行该单元格时的状态不一致,就会出现筛选为空的情况。
  2. 日期范围变量类型不匹配:inizio_settimana和fine_settimana如果是datetime类型,但经过多次转换后的日期列可能丢失了时间维度,导致匹配失败。

修复方案:

简化日期处理逻辑,一步到位完成转换:

# 直接解析为datetime并保留日期部分(午夜时间),避免冗余转换
df_m_dom['data/ora stato evento'] = pd.to_datetime(df_m_dom['data/ora stato evento'], errors='coerce').dt.normalize()

# 确保日期范围变量也是统一的datetime类型
inizio_settimana = pd.to_datetime(inizio_settimana).normalize()
fine_settimana = pd.to_datetime(fine_settimana).normalize()

df_filtrato_sett0 = df_m_dom[df_m_dom['data/ora stato evento'].between(inizio_settimana, fine_settimana)]

同时,每次Run All前必须重启内核(Kernel -> Restart),清除之前的全局变量状态,确保执行环境完全干净。


问题2:百分比计算的逻辑错误

你的百分比计算代码存在明显的逻辑漏洞:

df_merged_sett_dom['Variazione_Percentuale'] = np.where((df_merged_sett_dom['Media_8sett'] != 0) | (df_merged_sett_dom['Media_8sett'] != -0),
                                         ((df_merged_sett_dom['Score_point_sett_corr'] - df_merged_sett_dom['Media_8sett']) / df_merged_sett_dom['Media_8sett'].abs()) * 100,
                                         df_merged_sett_dom['Score_point_sett_corr'] * 100)

问题点:

逻辑或|使用错误!x != 0 | x != -0的结果永远为True(因为0和-0在数值上等价,任何数必然满足其中一个条件),导致所有行都会走第一个分支——当Media_8sett为0时,会触发除以0的警告/错误,Run All时可能被之前的变量状态掩盖,单独运行时又刚好没暴露,但实际逻辑完全错误。

修复方案:

改用绝对值判断是否为0,简化逻辑:

# 直接判断Media_8sett的绝对值是否不为0
df_merged_sett_dom['Variazione_Percentuale'] = np.where(df_merged_sett_dom['Media_8sett'].abs() != 0,
                                         ((df_merged_sett_dom['Score_point_sett_corr'] - df_merged_sett_dom['Media_8sett']) / df_merged_sett_dom['Media_8sett'].abs()) * 100,
                                         df_merged_sett_dom['Score_point_sett_corr'] * 100)

df_merged_sett_dom['Variazione_Percentuale'] = df_merged_sett_dom['Variazione_Percentuale'].round(0)
df_merged_sett_dom['Media_8sett'] = df_merged_sett_dom['Media_8sett'].round(0)

通用排查步骤

  1. 重启内核后再执行Run All:彻底清除全局变量的历史状态,确保执行顺序严格从上到下。
  2. 检查单元格执行编号:Jupyter左上角的单元格编号如果乱序,说明之前手动运行过单元格,导致变量状态混乱。
  3. 简化冗余代码:避免多次类型转换、重复赋值这类操作,减少隐式错误的可能。
  4. 加入调试输出:在关键步骤打印变量类型、样本值,比如日期筛选前打印df_m_dom['data/ora stato evento'].dtype和inizio_settimana的类型,对比两种运行方式下的差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:40:16