为什么我在python脚本中看到未知的数据帧?以及如何避免让脚本保存它们



在jupyter笔记本上的python脚本结束时,我检查了所有保存的可用数据帧。我使用以下代码:

# list of all DFs in memory
All_DFs = [var for var in dir() if isinstance(eval(var), pd.core.frame.DataFrame)]
All_DFs

除了我自己创建的数据帧之外,我看到了以下我不知道的数据帧。

['_14',
'_24',
'_38',
'_39',
'_40',
'_41',
'_8',
'__',
'___']

我想知道为什么要创建论文,我想知道如何避免创建它们。

谢谢你,

这些是运行代码并获得输出的单元格编号,可以再次显示,例如将_14放入Jupyter单元格。(特别是作为IPython/Jupyter的Output缓存系统的一部分创建的。(如果没有看到在相关单元格中运行的内容的示例,我完全在猜测它们为什么会出现在该列表中
我可以说,我能够重现这种现象的一种方法是在细胞的最后一行放上这样的东西:

pd.read_table(StringIO(input), header=0, index_col=None,  delim_whitespace=True)

我基本上定义了一个数据帧,但没有将其分配给变量。我并不是说你就是这么做的,但这是一种方法,我可以得到你看到的东西,然后测试摆脱这种情况。也许在您的案例中存在混合输出,并且您的评估代码在其中检测到数据帧?你必须提供更多的信息才能给出具体细节。(因为不建议事后收集这样的数据帧[见下文],所以我自己没有遇到这种情况的经验。(

如果你的笔记本其他一切都很好,我建议你不要刻意避免制作它们。您可以过滤掉它们,以实现避免笔记本中的Python代码保存它们的目标。您可以通过指定删除第一个字符为下划线的字符来完成此操作。(假设在某些情况下,您将数据帧分配给了刚刚遗漏的变量。(

建议示例

我将在这里的示例代码的基础上设置问题,以及如何在事后进行补救。让我们把以下代码放在一个单元格中并执行它:

import pandas as pd
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
input ='''
River_Level Rainfall
0.876       0.0
0.877       0.8
0.882       0.0
0.816       0.0
0.826       0.0
0.836       0.0
0.817       0.8
0.812       0.0
0.816       0.0
0.826       0.0
0.836       0.0
0.807       0.8
0.802       0.0
''' 
df_name_one = pd.read_table(StringIO(input), header=0, index_col=None,  delim_whitespace=True)
input ='''
River_Level Rainfall
0.976       0.1
0.977       0.5
0.982       0.0
0.916       0.3
0.926       0.0
0.996       9.0
0.917       0.8
0.912       0.0
0.916       0.0
0.926       0.1
0.836       0.0
0.907       0.6
0.902       0.0
''' 
df_name_two = pd.read_table(StringIO(input), header=0, index_col=None,  delim_whitespace=True)
pd.read_table(StringIO(input), header=0, index_col=None,  delim_whitespace=True)

然后在下一个Jupyter细胞中,我对你的代码运行了一个变体:

All_DFs = [var for var in dir() if isinstance(eval(var), pd.core.frame.DataFrame)]
All_DFs = [obj_name for obj_name in All_DFs if not obj_name.startswith("_")]
All_DFs

我只会看到以下输出:

['df_name_one', 'df_name_two']

如果我运行你的原始代码,我会看到:

['_1', 'df_name_one', 'df_name_two']

'_1'类似于您在列表中看到的示例。如果您添加过滤器以删除以下划线开头的内容,则不会看到这些内容。

(如果您像我在这里的示例代码中那样,在for循环中从dir()进行收集,则可以通过在append行之前添加行if not obj_name.startswith("_"):来简单地合并过滤器。(



注意,以这种方式收集数据帧是个坏主意正如matszwecja在此处的评论中所提到的那样。你在笔记本上偶然发现的问题就是一个很好的例子,说明为什么避免这样做是明智的建议。当然,有了一些后见之明和理解,你可以把它过滤掉;然而,您可能可以轻松地设计收集所需的内容,以便在开发过程中更容易地调试出更清晰、更健壮的代码。

写更好的问题和自己寻找答案的旁白。。。您在Jupyter笔记本中运行Python代码的事实在这里很重要,但您在标题中只说"Python脚本",并且只将"Python"one_answers"Pandas"作为类别。

最新更新