在我的代码中,我有几个变量,它们可以包含一个熊猫数据框架,也可以什么都不包含。假设我想测试一下,看看是否已经创建了某个 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 化的方法来处理这个问题?是我漏掉了什么,还是这只是一个尴尬的副作用所有关于熊猫的可怕的事情?