【问题标题】: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 没有

标签: python pandas


【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2021-07-12
          • 2023-02-25
          • 2017-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-12
          • 1970-01-01
          相关资源
          最近更新 更多