如何检查pandas Series是否为空?

47

len(ts) == 0 怎么样?编辑:ts.empty 应该可行。 - behzad.nouri
1
len(ts) 对我有用,但 ts.empty 不行。 - BP_
11个回答

39

我使用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
'''

1
我知道 :) 那个问题在小说中反复被问到,不是吗? - BP_
这是一个适当的评估! 现在的问题是,是应该只使用常规的len(df),以免混淆未来查看代码的初级程序员,还是仍然使用len(df.index)? - Danil
这个问题涉及到pandas的series。答案则是关于dataframe的;一个更好的检查dataframe是否为空的方法是 if len(df.columns) == 0。https://dev59.com/mWIj5IYBdhLWcg3w2odr#54009974 - Sven Haile

23

我使用此方法来检查DataFrame中特定列是否没有值或为空:

len(df.col_name.value_counts()) > 0

19
根据Pandas documentation,您需要使用empty属性而不是isempty
例如:
In [12]: df.empty
Out[13]: False

1
此外,根据OP链接的帖子,应该使用empty而不是isempty。不确定为什么他一开始没有读到这个... - acushner
这个问题涉及到pandas的series。答案则是关于dataframe的;一个更好的检查dataframe是否为空的方法是 if len(df.columns) == 0。https://dev59.com/mWIj5IYBdhLWcg3w2odr#54009974 - Sven Haile

10
如果NDFrame只包含NaN,则它仍然不被视为空。请参见下面的示例。
示例:
实际空DataFrame的示例。请注意,索引为空:
>>> df_empty = pd.DataFrame({'A' : []})
>>> df_empty
Empty DataFrame
Columns: [A]
Index: []
>>> df_empty.empty
True

如果我们的DataFrame中只有NaN值,它不被认为是空的!我们需要删除NaN值来使DataFrame为空:

>>> df = pd.DataFrame({'A' : [np.nan]})
>>> df
    A
0 NaN
>>> df.empty
False
>>> df.dropna().empty
True

来源


1
一个重要的区别! - JJL

5

长篇回答:取决于情况

根据您对空的定义,答案可能会有很大的不同,正如其他答案所示。我尝试进行总结,但首先需要一些测试数据框:

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'))

空 == 没有行

目前最流行的答案是:一个没有任何行的DataFrame是空的:

def empty_no_rows(df):
    return len(df.index) == 0

Empty等于没有列

还没有提到,但同样有效的是转置定义:

def empty_no_cols(df):
    return len(df.columns) == 0

空 == 没有值

实际上,你关心的是数值!如果你更喜欢一个能够处理空的 index 或者 columns 的定义,下面的定义可以起作用:

def empty_no_vals(df):
    return df.values.size == 0

Empty == 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

但实际上,这引出了下一个棘手的问题,你现在必须决定如何以及沿着哪个丢弃值?在这里,我坚持更加保守的all。一旦这些值被丢弃,你就可以将所有以上定义应用于其结果。

比较

DataFrame 无行 无列 无值 空白本地 空白NaNs
no_rows ✅ 真 ❌ 假 ✅ 真 ✅ 真 ✅ 真
no_cols ❌ 假 ✅ 真 ✅ 真 ✅ 真 ✅ 真
only_na ❌ 假 ❌ 假 ❌ 假 ❌ 假 ✅ 真

编辑备注:我会将所有这些函数称为is_empty_...,但这会导致比较表过于宽广。


1
这适用于单个pd.Series,例如pd.DataFrame的一列:
import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randn(10, 2), columns=list("AB"))
df["empty_series"] = np.nan

# this would lead to a non empty series
# df["empty_series"].iloc[0] = "foo"

# returns True of all values of series are NaN
print(df["empty_series"].isna().all())

在搜索“测试pandas空列”的过程中,我找到了这篇关于Series的帖子,尤其是这个答案非常有帮助。 - undefined

0
我将解释我的实验:
我有一个如下的代码:
matched_this = pd.Series(matched_groups)

有时候匹配结果是[]. 但match_this.empty却为False。 为了解决这个问题,我使用了以下方法:

if match_this[0]:
  # do ...

0

想要检查一个序列是否为空,我会执行以下操作:

df['your data'].notna().sum() == 0

0
如果你想检查列id,你可以尝试df[df["id"].isna()].shape[0] == 0

0

问题:如何检查pandas Series是否为空?

这里的许多答案都是处理测量空的pandas dataframe。 pandas dataframe与pandas Series不同。单个pandas Series在数据操作过程中可能会改变其长度。直接验证Series的长度可能很有用,可以使用以下方法:

  1. Series.empty
  2. len()
  3. len(Series.array)

简短示例

让我们创建3个数据框来比较测量系列长度时的输出

>>> df0 = pd.DataFrame({'X' : []})
>>> df0
Empty DataFrame
Columns: [X]
Index: []

>>> df1 = pd.DataFrame({'A' : ['np.Nan']})
>>> df1
   A
0  np.NaN

>>> df2 = pd.DataFrame({'B' : ['b']})
>>> df2
   B
0  b

pandas系列df0.X为空。因此,

1. >>> df0.X.empty
   True
2. >>> len(df0.X)
   0
3. >>> len(df0.x.array)
   0

每个pandas Series pf1.Adf2.B都包含1个值。因此,
df1.A                       |  df2.B
----------------------------|----------------------------
1. >>> df1.A.empty          |   1. >>> df2.B.empty
   False                    |      False
2. >>> len(df1.A)           |   2. >>> len(df2.B)
   1                        |      1
3. >>> len(df1.A.array)     |   3. >>> len(df2.B.array)
   1                        |      1

因此,要验证pandas Series是否为空,例如对于df['A'],可以使用以下方法。
if df.A.empty == True:

if len(df.A) == 0:

if len(df.A.array) == 0:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接