Jupyter Lab中相同if判断对比DataFrame时执行表现不一致问题
Jupyter Lab中pandas DataFrame不等判断分支不触发问题排查
问题场景
使用Jupyter Lab开展数据分析时,需要对比两个pandas DataFrame对象:
- df_lastweek:仅提取上周数据生成,共10行记录
- df_lastmonth:提取最近30天数据生成,共21行记录
二者数据内容、行数均存在明显差异,df_lastmonth行数显著多于df_lastweek。
异常表现
运行如下判断两个DataFrame不相等的代码时,if块内的df_lastmonth.describe()始终没有输出,疑似未被执行:
if not df_lastweek.equals(df_lastmonth): df_lastmonth.describe()
但在下一个单元格使用完全相同的if判断条件,却可以正常触发执行,成功调用regplot_of_df(df_lastmonth, 2000)完成数据绘图。调换两个单元格的执行顺序后,包含describe()的代码块依然没有对应输出。
两个DataFrame结构信息
df_lastweek 元信息
<class 'pandas.core.frame.DataFrame'> Int64Index: 10 entries, 0 to 9 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Date 10 non-null object 1 partofday 10 non-null object 2 Time 10 non-null object 3 SYS 10 non-null int64 4 DIA 10 non-null int64 5 Pulse 10 non-null int64 6 Measurement Date 10 non-null object 7 datetime 10 non-null datetime64[ns] 8 unix 10 non-null float64 9 elapsed_seconds 10 non-null float64 10 bp_stage 10 non-null object 11 bp_color 10 non-null object dtypes: datetime64[ns](1), float64(2), int64(3), object(6) memory usage: 1.0+ KB
df_lastmonth 元信息
<class 'pandas.core.frame.DataFrame'> Int64Index: 21 entries, 0 to 20 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Date 21 non-null object 1 partofday 21 non-null object 2 Time 21 non-null object 3 SYS 21 non-null int64 4 DIA 21 non-null int64 5 Pulse 21 non-null int64 6 Measurement Date 21 non-null object 7 datetime 21 non-null datetime64[ns] 8 unix 21 non-null float64 9 elapsed_seconds 21 non-null float64 10 bp_stage 21 non-null object 11 bp_color 21 non-null object dtypes: datetime64[ns](1), float64(2), int64(3), object(6) memory usage: 2.1+ KB
根因与解决方法
这个问题和pandas的equals()判断逻辑无关,是Jupyter的默认输出规则导致的误判:
- Jupyter单元格默认仅会自动渲染单元格最后一行表达式的返回值。
df_lastmonth.describe()是返回统计结果DataFrame的表达式,本身没有主动打印/渲染逻辑,如果它不是所在单元格的最后一行代码,运行后返回值不会被展示,看起来就像代码没有执行。 - 后续单元格的绘图函数可以正常显示,是因为绘图逻辑会主动将图像渲染到前端输出,不依赖Jupyter的最后一行自动输出规则,和if判断是否生效没有关联。
- 验证与修复:
- 将if块内代码改为
print(df_lastmonth.describe()),主动打印统计结果,运行后即可看到正常输出 - 也可以在if块内添加一行
print("已进入不等判断分支"),运行后会看到打印内容正常输出,直接证明判断逻辑完全正常
- 将if块内代码改为
- 补充说明:两个DataFrame行数分别为10行、21行,
df_lastweek.equals(df_lastmonth)本身必然返回False,判断条件不存在不触发的可能。
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

