pandas.DataFrame, Seriesが空か判定するempty

Posted: | Tags: Python, pandas

pandas.DataFrame, Seriesが空かどうかを判定するにはempty属性を使う。

本記事のサンプルコードで使用するpandasのバージョンは2.0.3

import pandas as pd

print(pd.__version__)
# 2.0.3

pandas.DataFrame, Seriesのempty属性の使い方

pandas.DataFrame.empty

pandas.DataFrameが空のとき(要素が存在しないとき)、empty属性はTrue

df_empty = pd.DataFrame()
print(df_empty)
# Empty DataFrame
# Columns: []
# Index: []

print(df_empty.empty)
# True

空でないとき(要素が存在するとき)、empty属性はFalse

df_full = pd.DataFrame({'A': [0, 1, 2]})
print(df_full)
#    A
# 0  0
# 1  1
# 2  2

print(df_full.empty)
# False

欠損値NaNは空とはみなされない。すべての要素がNaNでも、empty属性はFalse

df_nan = pd.DataFrame({'A': [float('NaN'), float('NaN'), float('NaN')]})
print(df_nan)
#     A
# 0 NaN
# 1 NaN
# 2 NaN

print(df_nan.empty)
# False

すべての要素がNaNであるかを判定するには、dropna()NaNを削除したあとでemptyを使う。

print(df_nan.dropna())
# Empty DataFrame
# Columns: [A]
# Index: []

print(df_nan.dropna().empty)
# True

デフォルトではdropna()は1つでもNaNがある行を削除するので注意。すべての要素がNaNの行を削除するにはhow='allとする。

df_mix = pd.DataFrame({'A': [float('NaN'), float('NaN'), float('NaN')], 'B': [0, 1, 2]})
print(df_mix)
#     A  B
# 0 NaN  0
# 1 NaN  1
# 2 NaN  2

print(df_mix.dropna())
# Empty DataFrame
# Columns: [A, B]
# Index: []

print(df_mix.dropna(how='all'))
#     A  B
# 0 NaN  0
# 1 NaN  1
# 2 NaN  2

pandas.Series.empty

pandas.Seriesempty属性もpandas.DataFrameと同様。

s_empty = pd.Series()
print(s_empty)
# Series([], dtype: object)

print(s_empty.empty)
# True
s_full = pd.Series([0, 1, 2])
print(s_full)
# 0    0
# 1    1
# 2    2
# dtype: int64

print(s_full.empty)
# False
s_nan = pd.Series([float('NaN'), float('NaN'), float('NaN')])
print(s_nan)
# 0   NaN
# 1   NaN
# 2   NaN
# dtype: float64

print(s_nan.empty)
# False

print(s_nan.dropna())
# Series([], dtype: float64)

print(s_nan.dropna().empty)
# True

注意点: 空のpandas.DataFrame, Seriesは偽と判定されない

Pythonでは、空のリストやタプル、辞書などは偽と判定される。

l_empty = []

print(bool(l_empty))
# False

if文などの条件式でリストなどを空か判定するにはオブジェクトをそのまま使うことが可能。

if not l_empty:
    print('Empty!')
# Empty!

一方、空のpandas.DataFrame, Seriesは偽と判定されないので注意。明示的にempty属性を使う必要がある。

df_empty = pd.DataFrame()
print(df_empty)
# Empty DataFrame
# Columns: []
# Index: []

# print(bool(df_empty))
# ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

print(df_empty.empty)
# True
# if df_empty:
#     print('Empty!')
# ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

if df_empty.empty:
    print('Empty!')
# Empty!

The truth value of a DataFrame is ambiguous.のエラーについての詳細は以下の記事を参照。

利用例: 条件を満たす行・要素が存在するか判定

比較演算子などを用いたブーリアンインデックスやquery()メソッドで、pandas.DataFrameの条件を満たす行を抽出できる。

条件を満たす行が存在しない場合は空のpandas.DataFrameが返される。抽出した結果が空かどうかをempty属性で判定することで、条件を満たす行が存在するかを判定できる。

df = pd.DataFrame({'A': [0, 1, 2], 'B': ['aaa', 'bbb', 'ccc']})
print(df)
#    A    B
# 0  0  aaa
# 1  1  bbb
# 2  2  ccc

print(df[df['A'] < 0])
# Empty DataFrame
# Columns: [A, B]
# Index: []

print(df[df['A'] < 0].empty)
# True
print(df.query('A < 0'))
# Empty DataFrame
# Columns: [A, B]
# Index: []

print(df.query('A < 0').empty)
# True

関連カテゴリー

関連記事