【发布时间】:2013-11-18 16:16:40
【问题描述】:
如何检查pandas DataFrame 是否为空?就我而言,如果DataFrame 为空,我想在终端中打印一些消息。
【问题讨论】:
-
len() 不起作用?它应该为空数据框返回 0。
如何检查pandas DataFrame 是否为空?就我而言,如果DataFrame 为空,我想在终端中打印一些消息。
【问题讨论】:
要查看数据框是否为空,我认为应该测试数据框列索引的长度:
if len(df.columns) == 0: 1
根据Pandas Reference API,有以下区别:
NaN,因此至少有 1 列
可以说,它们并不相同。其他答案不精确,因为 df.empty、len(df) 或 len(df.index) 没有区别,在这两种情况下都返回 index is 0 和 empty 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 为 0,empty 为 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
【讨论】:
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')
【讨论】:
我使用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
'''
【讨论】:
【讨论】:
df.shape[0] == 0 来检查数据框是否为空。你可以测试一下。
我更喜欢长途跋涉。这些是我为避免使用 try-except 子句而遵循的检查 -
这里,DATA 是可疑变量 -
DATA is not None and isinstance(DATA, pd.DataFrame) and not DATA.empty
【讨论】:
try/except 很便宜,if 很贵。 Python既不是Java也不是C;这里是Easier to Ask Forgiveness than Permission