pandas.DataFrame, Seriesが空か判定するempty
pandas.DataFrame
, Series
が空かどうかを判定するにはempty
属性を使う。
- pandas.DataFrame.empty — pandas 2.0.3 documentation
- pandas.Series.empty — pandas 2.0.3 documentation
目次
本記事のサンプルコードで使用するpandasのバージョンは2.0.3
。
import pandas as pd
print(pd.__version__)
# 2.0.3
source: pandas_empty.py
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
source: pandas_empty.py
空でないとき(要素が存在するとき)、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
source: pandas_empty.py
欠損値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
source: pandas_empty.py
すべての要素がNaN
であるかを判定するには、dropna()
でNaN
を削除したあとでempty
を使う。
print(df_nan.dropna())
# Empty DataFrame
# Columns: [A]
# Index: []
print(df_nan.dropna().empty)
# True
source: pandas_empty.py
デフォルトでは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
source: pandas_empty.py
pandas.Series.empty
pandas.Series
のempty
属性もpandas.DataFrame
と同様。
s_empty = pd.Series()
print(s_empty)
# Series([], dtype: object)
print(s_empty.empty)
# True
source: pandas_empty.py
s_full = pd.Series([0, 1, 2])
print(s_full)
# 0 0
# 1 1
# 2 2
# dtype: int64
print(s_full.empty)
# False
source: pandas_empty.py
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
source: pandas_empty.py
注意点: 空のpandas.DataFrame, Seriesは偽と判定されない
Pythonでは、空のリストやタプル、辞書などは偽と判定される。
l_empty = []
print(bool(l_empty))
# False
source: pandas_empty.py
if文などの条件式でリストなどを空か判定するにはオブジェクトをそのまま使うことが可能。
if not l_empty:
print('Empty!')
# Empty!
source: pandas_empty.py
一方、空の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
source: pandas_empty.py
# 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!
source: pandas_empty.py
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
source: pandas_empty.py
print(df.query('A < 0'))
# Empty DataFrame
# Columns: [A, B]
# Index: []
print(df.query('A < 0').empty)
# True
source: pandas_empty.py