测试是否存在pandas数据帧

2024-04-20 13:10:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的代码中,有几个变量可以包含pandas数据框,也可以不包含任何内容。假设我想测试某个数据帧是否已经创建。我的第一个想法是这样测试:

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

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

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

另一个解决方案是有一个指示符变量:df1_exists,在创建df1之前,该变量设置为False。然后,不是测试df1,而是测试df1_exists。但这也不是那么优雅。

有没有更好的,更像Python的方法来处理这个问题?是我遗漏了什么,还是这只是熊猫可怕的副作用?


Tags: 数据方法代码none类型dataframeiftype
2条回答

In my code, I have several variables which can either contain a pandas DataFrame or nothing at all

python表示“nothing”的方式是viaNone,用于通过

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's

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

None初始化一个变量,然后在对该变量执行操作之前检查None,这是非常习惯的python。

df1 = None

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

选项2

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

df1 = pd.DataFrame()

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

选项3

试试看。

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

相关问题 更多 >