【发布时间】:2016-09-05 20:11:45
【问题描述】:
在我的代码中,我有几个变量可以包含 pandas 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 或 Python None 的存在测试。
这是一种可行的方法:
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_exists,而不是测试df1。但这似乎也不是那么优雅。
有没有更好、更 Pythonic 的方式来处理这个问题?我是否遗漏了什么,或者这只是熊猫所有令人敬畏的东西的尴尬副作用?
【问题讨论】: