【问题标题】:Testing if a pandas DataFrame exists测试 pandas DataFrame 是否存在
【发布时间】: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 的方式来处理这个问题?我是否遗漏了什么,或者这只是熊猫所有令人敬畏的东西的尴尬副作用?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    选项 1(我的首选)

    这是@Ami Tavory 的

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

    使用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处于初始化状态或根本不存在时

    df1 是一个包含某些内容的数据框时

    df1 = pd.DataFrame(np.arange(25).reshape(5, 5), list('ABCDE'), list('abcde'))
    df1
    

    【讨论】:

    • 可以添加时间吗?
    【解决方案2】:

    在我的代码中,我有几个变量可以包含 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
    

    因此,检查 is not None 是否也比 isinstance 替代方案更快。

    【讨论】:

    • 我的首选答案。
    • 但是,df1 必须定义,因此需要df1 = None,就像 piRSquared 的回答一样。
    【解决方案3】:

    如果数据框存储为字典值,您可以通过以下方式测试其是否存在:

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

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2019-02-22
      • 2020-09-07
      • 2011-08-05
      • 2011-02-16
      • 2013-11-11
      相关资源
      最近更新 更多