空 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)
当涉及到 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)