测试 pandas DataFrame 是否存在

89

在我的代码中,我有几个变量可以包含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,以便在空值和非空值情况下类型相同。然后我可以使用len()any()等方法进行测试。不过,创建一个空的DataFrame似乎有点愚蠢和浪费。

另一种解决方案是使用指示变量:df1_exists,直到创建df1为止将其设置为False。然后,我将测试df1_exists而不是df1。但这似乎也不是很优雅。

是否有更好、更符合Python风格的处理方式?我有什么遗漏吗,还是这只是Pandas所有强大功能中的一种笨拙的副作用?

4个回答

165

选项1(我偏好的选项)

这是@Ami Tavory的

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

在Python中,使用None初始化变量,然后在对该变量进行操作之前检查None是非常惯用的。

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


5
你能加上时间吗? - jezrael

64

在我的代码中,我有几个变量可能包含一个pandas DataFrame或者什么都没有。

Pythonic的方式是用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

因此,检查某个内容 是否为None,也比使用 isinstance 更快。


2
我偏爱的答案。 - piRSquared
df1必须被定义,因此需要像piRSquared的答案中一样使用df1 = None - Skippy le Grand Gourou

1
你尝试过使用 %who_ls DataFrame 吗? 它会输出一个包含所有定义的 DataFrame 的列表。 然后你可以检查它是否包含一个与你要查找的 df 名称相同的元素。
listdf=%who_ls DataFrame
if 'df1' in listdf: print("df1 exists!")

这仍然无法告诉您它是否为空,只能告诉您它是否存在。

您也可以使用%who_ls来查看其他类型的元素。


1
如果数据框以字典值存储,你可以这样测试它是否存在:
如果数据框以字典值存储,您可以通过以下方式测试其是否存在:
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')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接