空 DataFrame 不承认它是空的

Empty DataFrame doesn't admit its empty

当涉及到 pandas DataFrames 时,我一定不了解空虚。我有一个带有空行的 DF,但是当我隔离这些行之一时它不是空的。

这里我制作了一个数据框:

>>> df = pandas.DataFrame(columns=[1,2,3], data=[[1,2,3],[1,None,3],[None, None, None],[3,2,1],[4,5,6],[None,None,None],[None,None,None]])
>>> df
     1    2    3
0  1.0  2.0  3.0
1  1.0  NaN  3.0
2  NaN  NaN  NaN
3  3.0  2.0  1.0
4  4.0  5.0  6.0
5  NaN  NaN  NaN
6  NaN  NaN  NaN

然后我知道“2”行什么都没有,所以我检查一下...

>>> df[2:3].empty
    False

奇数。所以我将它拆分成自己的数据框:

>>> df1 = df[2:3]
>>> df1
    1   2   3
2 NaN NaN NaN

>>> df1.empty
False

如何检查是否为空(一行中的所有元素都是 None 或 NaN?)

http://pandas.pydata.org/pandas-docs/version/0.18/generated/pandas.DataFrame.empty.html

我猜你正在寻找这样的东西:

In [296]: df[5:]
Out[296]:
    1   2   3
5 NaN NaN NaN
6 NaN NaN NaN

In [297]: df[5:].isnull().all(1).all()
Out[297]: True

甚至更好(如):

In [300]: df[5:].isnull().all().all()
Out[300]: True

您误解了 empty 的用途。这是为了检查 series/dataframe 的大小是否大于 0,这意味着有行。例如,

df.iloc[1:0]

Empty DataFrame
Columns: [1, 2, 3]
Index: []

df.iloc[1:0].empty
True

如果要检查某行是否包含 所有 NaNs,请使用 isnull + all:

df.isnull().all(1)

0    False
1    False
2     True
3    False
4    False
5     True
6     True
dtype: bool

对于您的示例,应该这样做:

df[2:3].isnull().all(1).item()
True

请注意,如果切片的大小超过一行,则不能使用 item

我猜你必须使用 isnull() 而不是 empty()

import pandas 
df = pandas.DataFrame(columns=[1,2,3], data=[[1,2,3],[1,None,3],[None, None, None],[3,2,1],[4,5,6],[None,None,None],[None,None,None]])
df[2:3].isnull()
1   2   3
True    True    True

您可以从您的选择中删除所有空值并检查结果是否为空:

>>> df[5:].dropna(how='all').empty
True

如果您不想将 NaN 值计为实数,这将等于

df.dropna().iloc[5:]

您 select 您的数据框中不存在该行

df.dropna().iloc[5:].empty
Out[921]: True

如果您有一个数据框并希望删除每列中包含 NaN 的所有行,您可以这样做

df.dropna(how='all')

注意到在某些情况下,您的数据框的一列中也有 NaN。如果在这种情况下需要删除整行:

df.dropna(how='any')

执行此操作后(您喜欢哪个),您可以使用以下方法检查数据帧的长度(它包含的行数):

len(df)