如何检查熊猫系列是不是为空?

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

【讨论】:

以上是关于如何检查熊猫系列是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中检查 NSArray 是不是为空或为空?

如何检查 Recyclerview 是不是为空

如何检查火花数据框是不是为空?

如何检查火花数据框是不是为空?

如何检查 RXSwift 中的 observable 是不是为空?

如何检查结果集是不是为空?