如何检查熊猫数据帧是否为空?

如何检查熊猫DataFrame是否为空?在我的情况下,我想在终端打印一些消息,如果DataFrame是空的。

704829 次浏览

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

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

来源:# EYZ0

我使用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
'''

我更喜欢走长线。以下是我避免使用try-except子句-的检查方法

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

这里,DATA是可疑变量-

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

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

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

原因:

根据Pandas参考API,有以下区别:

  • 一个空的数据框架,0行和0列
  • 一个空的数据框架,行包含NaN,因此是至少一列

可以说,它们是不一样的。其他答案是不精确的,因为df.emptylen(df)len(df.index)没有区别,在这两种情况下都返回Index为0空为真

例子

例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为0空为真。当为第一个加载的数据帧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
  1. 如果一个DataFrame有Nan和Non Null值,你想要找到DataFrame

  2. 这种情况什么时候会发生? 当使用一个函数绘制多个DataFrame时,就会发生这种情况 它们作为参数传递。在这种情况下,函数尝试绘制数据 当一个数据帧是空的,从而绘制一个空的图形! 如果只是显示“DataFrame has no data”消息,这将是有意义的

  3. <李> < p >为什么? 如果一个DataFrame是空的(即不包含任何数据。注意DataFrame的Nan值 被认为是非空的),那么最好不要绘图,而是发出一条信息: 假设我们有两个数据框架df1和df2。 函数myfunc接受任何DataFrame(在本例中为df1和df2)并打印一条消息 如果一个数据帧是空的(而不是绘图):

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