测试熊猫 DataFrame 是否存在

在我的代码中,我有几个变量,它们可以包含一个熊猫数据框架,也可以什么都不包含。假设我想测试一下,看看是否已经创建了某个 DataFrame。我的第一个想法是这样测试它:

if df1:
# do something

然而,该代码以这种方式失败:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

好吧。理想情况下,我希望有一个既适用于 DataFrame 又适用于 PythonNothing 的状态测试。

这里有一个可行的方法:

if not isinstance(df1, type(None)):
# do something

然而,类型测试真的很慢。

t = timeit.Timer('if None: pass')
t.timeit()
# approximately 0.04
t = timeit.Timer('if isinstance(x, type(None)): pass', setup='x=None')
t.timeit()
# approximately 0.4

哎哟,除了速度慢之外,对 NoneType 的测试也不是很灵活。

另一种解决方案是将 df1初始化为空 DataFrame,这样在 null 和非 null 情况下类型都是相同的。然后我可以用 len()或者 any()或者类似的东西来测试。不过,创建一个空的 DataFrame 似乎有点愚蠢和浪费。

另一种解决方案是有一个指示器变量: df1_exists,在创建 df1之前,它被设置为 False。然后,不测试 df1,我将测试 df1_exists。但这看起来也没那么优雅。

有没有更好的,更 Python 化的方法来处理这个问题?是我漏掉了什么,还是这只是一个尴尬的副作用所有关于熊猫的可怕的事情?

95563 次浏览

在我的代码中,我有几个变量,它们可以包含一个熊猫数据框架,也可以什么都不包含

Python 中表示“无”的方法是通过 None,而检查“非无”的方法是通过

if df1 is not None:
...

我不知道这里的时间有多关键,但既然你测量了东西:

In [82]: t = timeit.Timer('if x is not None: pass', setup='x=None')


In [83]: t.timeit()
Out[83]: 0.022536039352416992


In [84]: t = timeit.Timer('if isinstance(x, type(None)): pass', setup='x=None')


In [85]: t.timeit()
Out[85]: 0.11571192741394043

所以检查某样东西 is not None,也比 isinstance快。

选项1 (我的首选)

这是@Ami Tavory 的

如果你喜欢这种方法,请选择他的答案

使用 None初始化一个变量,然后在使用该变量之前检查 None,这是非常惯用的 python 做法。

df1 = None


if df1 is not None:
print df1.head()

选择二

然而,设置一个空的数据框架并不是一个坏主意。

df1 = pd.DataFrame()


if not df1.empty:
print df1.head()

选择三

试试吧。

try:
print df1.head()
# catch when df1 is None
except AttributeError:
pass
# catch when it hasn't even been defined
except NameError:
pass

时机

df1处于初始化状态或根本不存在时

enter image description here

df1是一个有内容的数据框架时

df1 = pd.DataFrame(np.arange(25).reshape(5, 5), list('ABCDE'), list('abcde'))
df1

enter image description here

enter image description here

如果数据框是以字典值的形式存储的,那么您可以通过以下方式测试它的存在:

import pandas as pd


d = dict()
df = pd.DataFrame()


d['df'] = df


## the 'None' is default but including it for the example
if d.get('df', None) is not None:
## get df shape
print(df.shape)
else:
print('no df here')


你试过谁是数据框架吗? 它输出一个包含所有定义的 DataFrames 的列表。 然后您可以检查它是否包含一个名为 df 的元素。

listdf=%who_ls DataFrame
if 'df1' in listdf: print("df1 exists!")

这仍然不能告诉你它是否是空的,只能告诉你它是否存在。

也可以对其他类型的元素使用% who _ ls。