测试是否存在pandas DataFrame

J J*_*nes 30 python dataframe pandas

在我的代码中,我有几个变量可以包含一个pandas DataFrame,或者根本没有.假设我想测试并查看是否已创建某个DataFrame.我的第一个想法是像这样测试它:

if df1:
    # do something
Run Code Online (Sandbox Code Playgroud)

但是,该代码以这种方式失败:

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

很公平.理想情况下,我希望有一个适用于DataFrame或Python None的状态测试.

这是一种可行的方法:

if not isinstance(df1, type(None)):
    # do something
Run Code Online (Sandbox Code Playgroud)

但是,测试类型真的很慢.

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
Run Code Online (Sandbox Code Playgroud)

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

另一种解决方案是初始化df1为空DataFrame,以便在null和非null情况下类型都相同.然后我可以测试使用len(),或者any()类似的东西.但是,制作一个空的DataFrame似乎有些愚蠢和浪费.

另一种解决方案是使用指示符变量:在创建df1_exists之前设置为False df1.然后,df1我会测试,而不是测试df1_exists.但这似乎并不那么优雅.

是否有更好,更Pythonic的方式来处理这个问题?我错过了什么,或者这只是熊猫所有令人敬畏的事情的一个尴尬的副作用?

piR*_*red 50

选项1(我的首选方案)

这是@Ami Tavory的

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

初始化变量是非常惯用的python,None然后None在对该变量做某事之前检查它.

df1 = None

if df1 is not None:
    print df1.head()
Run Code Online (Sandbox Code Playgroud)

选项2

但是,设置空数据帧并不是一个坏主意.

df1 = pd.DataFrame()

if not df1.empty:
    print df1.head()
Run Code Online (Sandbox Code Playgroud)

选项3

就试一试吧.

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

定时

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

在此输入图像描述

什么时候df1是包含内容的数据框

df1 = pd.DataFrame(np.arange(25).reshape(5, 5), list('ABCDE'), list('abcde'))
df1
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

  • 你能加点时间吗? (2认同)

Ami*_*ory 21

在我的代码中,我有几个变量可以包含一个pandas DataFrame,或者根本没有

表示"没有"的Pythonic方式是via None,并且用于检查"not nothing"via

if df1 is not None:
    ...
Run Code Online (Sandbox Code Playgroud)

我不确定这里有多关键时刻,但是因为你测量了一些东西:

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
Run Code Online (Sandbox Code Playgroud)

因此,检查某些东西is not None,也比isinstance替代方案更快.

  • 我的首选答案。 (2认同)