【问题标题】:How to check whether a pandas DataFrame is empty?如何检查 pandas DataFrame 是否为空?
【发布时间】:2013-11-18 16:16:40
【问题描述】:

如何检查pandas DataFrame 是否为空?就我而言,如果DataFrame 为空,我想在终端中打印一些消息。

【问题讨论】:

  • len() 不起作用?它应该为空数据框返回 0。

标签: python pandas dataframe


【解决方案1】:

要查看数据框是否为空,我认为应该测试数据框列索引的长度

if len(df.columns) == 0: 1

原因:

根据Pandas Reference API,有以下区别:

  • 0 行 0 列的空数据框
  • 一个空数据框,其行包含NaN,因此至少有 1 列

可以说,它们并不相同。其他答案不精确,因为 df.emptylen(df)len(df.index) 没有区别,在这两种情况下都返回 index is 0empty is True

示例

示例 1:0 行 0 列的空数据框

In [1]: import pandas as pd
        df1 = pd.DataFrame()
        df1
Out[1]: Empty DataFrame
        Columns: []
        Index: []

In [2]: len(df1.index)  # or len(df1)
Out[2]: 0

In [3]: df1.empty
Out[3]: True

示例 2:清空为 0 行但仍保留 n 列的数据框

In [4]: df2 = pd.DataFrame({'AA' : [1, 2, 3], 'BB' : [11, 22, 33]})
        df2
Out[4]:    AA  BB
        0   1  11
        1   2  22
        2   3  33

In [5]: df2 = df2[df2['AA'] == 5]
        df2
Out[5]: Empty DataFrame
        Columns: [AA, BB]
        Index: []

In [6]: len(df2.index)  # or len(df2)
Out[6]: 0

In [7]: df2.empty
Out[7]: True

现在,以前面的例子为基础,其中 index 为 0empty 为 True。在读取第一个加载的数据帧df1的列索引长度时,它返回0列以证明它确实是空的。

In [8]: len(df1.columns)
Out[8]: 0

In [9]: len(df2.columns)
Out[9]: 2

严重,虽然第二个数据帧 df2 不包含任何数据,但它并非完全为空,因为它返回持续存在的空列的数量。

为什么重要

让我们向这些数据框添加一个新列以了解其含义:

# As expected, the empty column displays 1 series
In [10]: df1['CC'] = [111, 222, 333]
         df1
Out[10]:    CC
         0 111
         1 222
         2 333
In [11]: len(df1.columns)
Out[11]: 1

# Note the persisting series with rows containing `NaN` values in df2
In [12]: df2['CC'] = [111, 222, 333]
         df2
Out[12]:    AA  BB   CC
         0 NaN NaN  111
         1 NaN NaN  222
         2 NaN NaN  333
In [13]: len(df2.columns)
Out[13]: 3

很明显,df2 中的原始列已经重新浮出水面。因此,谨慎的做法是改为使用len(pandas.core.frame.DataFrame.columns) 读取列索引的长度,以查看数据框是否为空。

实用解决方案

# New dataframe df
In [1]: df = pd.DataFrame({'AA' : [1, 2, 3], 'BB' : [11, 22, 33]})
        df
Out[1]:    AA  BB
        0   1  11
        1   2  22
        2   3  33

# This data manipulation approach results in an empty df
# because of a subset of values that are not available (`NaN`)
In [2]: df = df[df['AA'] == 5]
        df
Out[2]: Empty DataFrame
        Columns: [AA, BB]
        Index: []

# NOTE: the df is empty, BUT the columns are persistent
In [3]: len(df.columns)
Out[3]: 2

# And accordingly, the other answers on this page
In [4]: len(df.index)  # or len(df)
Out[4]: 0

In [5]: df.empty
Out[5]: True
# SOLUTION: conditionally check for empty columns
In [6]: if len(df.columns) != 0:  # <--- here
            # Do something, e.g. 
            # drop any columns containing rows with `NaN`
            # to make the df really empty
            df = df.dropna(how='all', axis=1)
        df
Out[6]: Empty DataFrame
        Columns: []
        Index: []

# Testing shows it is indeed empty now
In [7]: len(df.columns)
Out[7]: 0

添加新数据系列按预期工作,无需重新显示空列(事实上,没有任何系列只包含 NaN 的行):

In [8]: df['CC'] = [111, 222, 333]
         df
Out[8]:    CC
         0 111
         1 222
         2 333
In [9]: len(df.columns)
Out[9]: 1

【讨论】:

    【解决方案2】:
    1) 如果 DataFrame 有 Nan 和 Non Null 值,你想查找 DataFrame 是否
    是否为空然后尝试此代码。
    2)什么时候会发生这种情况?
    当使用单个函数绘制多个 DataFrame 时会发生这种情况
    作为参数传递。在这种情况下,函数会尝试绘制数据
    当 DataFrame 为空并因此绘制一个空图时!
    如果简单地显示“DataFrame 没有数据”消息,这将是有意义的。
    3)为什么?
    如果 DataFrame 为空(即根本不包含数据。请注意带有 Nan 值的 DataFrame
    被认为是非空的)那么最好不要绘制而是发出一条消息:
    假设我们有两个 DataFrame df1 和 df2。
    函数 myfunc 接受任何 DataFrame(在本例中为 df1 和 df2)并打印一条消息
    如果 DataFrame 为空(而不是绘图):
    df1                     df2
    col1 col2           col1 col2 
    Nan   2              Nan  Nan 
    2     Nan            Nan  Nan  
    

    和功能:

    def myfunc(df):
      if (df.count().sum())>0: ##count the total number of non Nan values.Equal to 0 if DataFrame is empty
         print('not empty')
         df.plot(kind='barh')
      else:
         display a message instead of plotting if it is empty
         print('empty')
    

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案以添加解释并说明适用的限制和假设。 From Review
    【解决方案3】:

    我使用len 函数。它比empty 快得多。 len(df.index) 更快。

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(np.random.randn(10000, 4), columns=list('ABCD'))
    
    def empty(df):
        return df.empty
    
    def lenz(df):
        return len(df) == 0
    
    def lenzi(df):
        return len(df.index) == 0
    
    '''
    %timeit empty(df)
    %timeit lenz(df)
    %timeit lenzi(df)
    
    10000 loops, best of 3: 13.9 µs per loop
    100000 loops, best of 3: 2.34 µs per loop
    1000000 loops, best of 3: 695 ns per loop
    
    len on index seems to be faster
    '''
    

    【讨论】:

    • 由于 len(df.index) == 0 或 len(df.columns) == 0,DataFrame 也可以为空。
    • 不,数据框可以包含列但仍为空。 len(df.index) == 0 是最好的解决方案
    【解决方案4】:

    您可以使用属性df.empty 来检查它是否为空:

    if df.empty:
        print('DataFrame is empty!')
    

    来源:Pandas Documentation

    【讨论】:

    • 这看起来很可惜,因为你需要知道 df 是一个 pd.DataFrame。我想知道不在 pd.DataFrame 上实现 bool() 的动机。
    • @Quant - 文档讨论了为什么 bool 在此处引发数据框错误:link。引用:“它应该是 True,因为它不是零长度吗?False 因为有 False 值?不清楚,所以相反,pandas 会引发 ValueError”
    • 更快的方法是df.shape[0] == 0 来检查数据框是否为空。你可以测试一下。
    • 此方法不适用于所有情况,因为在某些情况下,空数据框可能是 NoneType。
    【解决方案5】:

    我更喜欢长途跋涉。这些是我为避免使用 try-except 子句而遵循的检查 -

    1. 检查变量是否不是无
    2. 然后检查它是否是一个数据框和
    3. 确保它不为空

    这里,DATA 是可疑变量 -

    DATA is not None and isinstance(DATA, pd.DataFrame) and not DATA.empty
    

    【讨论】:

    • 如果预期变量将是一个空或有行的 DataFrame(这是 OP 所暗示的),这是多余的和不好的做法。如果它不是 DF(或者如果它没有),则应该抛出异常,因为某处出了问题。
    • 在 Python 中,try/except 很便宜,if 很贵。 Python既不是Java也不是C;这里是Easier to Ask Forgiveness than Permission
    猜你喜欢
    • 2018-01-29
    • 2017-08-12
    • 2021-05-19
    • 2015-06-14
    • 2021-12-24
    • 2021-04-28
    • 2018-05-25
    • 2016-08-28
    相关资源
    最近更新 更多