如何检查熊猫系列是不是为空?
Posted
技术标签:
【中文标题】如何检查熊猫系列是不是为空?【英文标题】:How to check if pandas Series is empty?如何检查熊猫系列是否为空? 【发布时间】:2014-08-30 09:42:15 【问题描述】:如何判断pandas Series是否为空?
我试过这个:
How to check whether a pandas DataFrame is empty?
但似乎 Series 没有属性“isempty”。
【问题讨论】:
len(ts) == 0
怎么样?编辑:ts.empty
应该可以工作
len(ts)
为我工作 ts.empty
没有
【参考方案1】:
我使用 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) 来不让未来的小辈在看代码时感到困惑,还是仍然使用 len(df.index)?【参考方案2】:我用它来检查 dataFrame 中的特定列是否没有值或为空:
len(df.col_name.value_counts()) > 0
【讨论】:
【参考方案3】:根据 Pandas documentation,您需要使用 empty
属性而不是 isempty
例如
In [12]: df.empty
Out[13]: False
【讨论】:
另外,根据 OP 链接到的帖子,它是empty
而不是 isempty
。不知道他为什么一开始没有读到……【参考方案4】:
如果 NDFrame 包含仅个 NaN,它仍然不被认为是空的。请参阅下面的示例。
示例
一个实际的空 DataFrame 示例。注意索引是空的:
>>> df_empty = pd.DataFrame('A' : [])
>>> df_empty
Empty DataFrame
Columns: [A]
Index: []
>>> df_empty.empty
True
如果我们的 DataFrame 中只有 NaNs,它不会被认为是空的!我们需要删除 NaNs 以使 DataFrame 为空:
>>> df = pd.DataFrame('A' : [np.nan])
>>> df
A
0 NaN
>>> df.empty
False
>>> df.dropna().empty
True
Source
【讨论】:
一个重要的区别!【参考方案5】:长答案:视情况而定
根据您对空的定义,您的答案可能会有很大差异,正如其他各种答案所示。我试着总结一下,但首先有一些测试DataFrames:
no_rows = pd.DataFrame([], columns=list('ABCD'))
no_cols = pd.DataFrame([], index=range(3))
only_na = pd.DataFrame(float('nan'), index=range(3), columns=list('ABCD'))
空 == 没有行
目前最流行的回答是采用这种方式:0行的DataFrame是空的:
def empty_no_rows(df):
return len(df.index) == 0
空 == 没有列
尚未提及,但同样有效的是转置定义:
def empty_no_cols(df):
return len(df.columns) == 0
空 == 没有值
其实不是,你关心的是价值观!如果您更喜欢可以同时处理空 index
或 columns
的定义,则以下定义将起作用:
def empty_no_vals(df):
return df.values.size == 0
空 == pandas 说的
为什么不接受 pandas 自己的空虚定义,这对于这些测试用例会导致与无值定义相同的结果:
def empty_native(df):
return df.empty
Pandas 自己的实现基本上只是检查len(df.columns) == 0 or len(df.index) == 0
,从不直接查看values
。
空 == 不仅是 NaN
最后,您可能想在考虑中忽略NaN
:
def empty_nans(df):
return df.dropna(how='all').empty
但实际上,这会打开下一个蠕虫,因为您现在必须决定 how
以及要丢弃哪个 axis
?我在这里坚持更保守的all
。一旦删除了这些值,您现在可以将上述所有定义应用于其结果。
比较
DataFrame | empty_no_rows | empty_no_cols | empty_no_vals | empty_native | empty_nans |
---|---|---|---|---|---|
no_rows |
✅ True | ❌ False | ✅ True | ✅ True | ✅ True |
no_cols |
❌ False | ✅ True | ✅ True | ✅ True | ✅ True |
only_na |
❌ False | ❌ False | ❌ False | ❌ False | ✅ True |
编者注:我将所有这些函数都称为is_empty_...
,但这会导致比较表太宽。
【讨论】:
【参考方案6】:感谢@sparrow,我用它来测试日期时间列:
if len(df.select_dtypes(include='datetime').iloc[0].value_counts()) == 0:
print('DF DATETIME COLUMNS: ', len(df_dt.iloc[0].value_counts()))
其他方法(a.any()、a.empty()...)都不起作用。 select 返回一个非空索引但有空列,所以我认为就是这样。 我认为它实际上返回了一个系列,因此 iloc 为零。
【讨论】:
【参考方案7】:要检查一个系列是否为空,我执行以下操作:
df['your data'].notna().sum() == 0
【讨论】:
以上是关于如何检查熊猫系列是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章