【Pandas入門】DataFrame・Seriesが空かどうかを判定するempty属性
データ分析を進める中で、「このDataFrameやSeriesにデータが全く入っているか?」を確認したい場面は頻繁にあります。特に、データのフィルタリングや集計を行った後、結果が空になっていないかを確認することは、その後の処理を安全に進める上で非常に重要です。Pandasの**empty属性を使えば、DataFrameやSeriesが空(要素が一つもない状態)**であるかどうかを簡単に判定できます。この記事では、empty属性の基本的な使い方から、知っておくと便利な活用シーンまで、短いサンプルコードと丁寧な解説を交えてご紹介します。
empty属性とは?なぜ空判定が必要なのか?
Pandasのempty属性は、DataFrameまたはSeriesがデータ要素を1つも持たない(つまり、行も列も存在しないか、要素数がゼロ)場合にTrueを、それ以外の場合にFalseを返すブール属性です。
空判定が必要な主な理由は以下の通りです。
-
エラーハンドリング: 空のDataFrame/Seriesに対して特定の操作(例: 平均値の計算、グラフの描画)を実行すると、エラーが発生したり、意図しない結果になったりする可能性があります。事前に空かどうかをチェックすることで、こうした問題を回避できます。
-
条件分岐: データが存在する場合と存在しない場合で、処理の流れを変えたいときに使います。
-
例: 「データがあれば集計に進む」「データがなければユーザーに通知する」
-
-
デバッグ: 意図せずデータが空になってしまった原因を探る際に役立ちます。
empty属性の基本的な使い方
empty属性は、DataFrameやSeriesの後に.emptyとつけるだけで利用できます。
空のDataFrame/Seriesを判定する
要素が全く含まれていないDataFrameやSeriesはempty属性がTrueになります。
import pandas as pd
# 空のDataFrameを作成
df_empty = pd.DataFrame()
print("空のDataFrame:\n", df_empty)
print(f"df_empty.empty: {df_empty.empty}")
# 空のSeriesを作成
s_empty = pd.Series()
print("\n空のSeries:\n", s_empty)
print(f"s_empty.empty: {s_empty.empty}")
解説:
DataFrameやSeriesを明示的に空として初期化した場合、empty属性はTrueを返します。
データを含むDataFrame/Seriesを判定する
一つでもデータ要素が含まれていれば、empty属性はFalseを返します。
# データを含むDataFrame
df_not_empty = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
print("\nデータを含むDataFrame:\n", df_not_empty)
print(f"df_not_empty.empty: {df_not_empty.empty}")
# データを含むSeries
s_not_empty = pd.Series([10, 20, 30])
print("\nデータを含むSeries:\n", s_not_empty)
print(f"s_not_empty.empty: {s_not_empty.empty}")
empty属性の活用シーン
empty属性は、特にデータのフィルタリングや条件に応じた処理を行う際に威力を発揮します。
フィルタリング後のDataFrameが空かどうかのチェック
特定の条件でデータをフィルタリングした結果、DataFrameが空になることがあります。その後の処理に進む前に、emptyで確認することが重要です。
# サンプルDataFrame
df = pd.DataFrame({
'商品名': ['りんご', 'みかん', 'バナナ'],
'価格': [100, 120, 80]
})
print("オリジナルDataFrame:\n", df)
# 条件を満たす商品が存在する場合
filtered_df_exists = df[df['価格'] > 90]
print("\n価格が90より大きい商品:\n", filtered_df_exists)
if not filtered_df_exists.empty:
print("-> フィルタリング結果にデータが存在します。")
else:
print("-> フィルタリング結果は空です。")
# 条件を満たす商品が存在しない場合
filtered_df_not_exists = df[df['価格'] > 200]
print("\n価格が200より大きい商品:\n", filtered_df_not_exists)
if not filtered_df_not_exists.empty:
print("-> フィルタリング結果にデータが存在します。")
else:
print("-> フィルタリング結果は空です。処理をスキップします。")
解説:
if not filtered_df_exists.empty: のように記述することで、「DataFrameが空でなければ(=データが存在すれば)この処理を実行する」という条件分岐をスマートに実装できます。
欠損値 (NaN) のみを含む場合のempty判定
DataFrameやSeriesが、値としては欠損値(NaN)しか含まない場合でも、要素数がゼロでなければemptyはFalseを返します。emptyはあくまで要素の有無を判定するものです。
import numpy as np
df_nan_only = pd.DataFrame({'A': [np.nan, np.nan]})
print("\nNaNのみを含むDataFrame:\n", df_nan_only)
print(f"df_nan_only.empty: {df_nan_only.empty}")
s_nan_only = pd.Series([np.nan, np.nan])
print("\nNaNのみを含むSeries:\n", s_nan_only)
print(f"s_nan_only.empty: {s_nan_only.empty}")
解説:
NaNは「値が存在しない」ことを意味しますが、要素としては存在するため、上記の場合はemptyがFalseになります。要素数そのものがゼロであるかどうかの判定に特化している点に注意してください。
その他の空判定方法との比較(参考)
-
len()で要素数をチェック:
len(df) == 0 でも空判定は可能ですが、DataFrameの場合は行数、Seriesの場合は要素数を返すため、直感的にわかりやすいのはemptyです。
Pythonprint(f"len(df_empty) == 0: {len(df_empty) == 0}") print(f"len(df_not_empty) == 0: {len(df_not_empty) == 0}") -
.shapeで形状をチェック:
df.shape[0] == 0 (行数チェック) や df.shape == (0, 0) (完全な空のDataFrameチェック) でも判定可能ですが、emptyが最も簡潔です。
基本的には、DataFrameやSeriesが要素を全く持たない状態かをチェックするには、empty属性が最も推奨される方法です。
まとめ
Pandasのempty属性は、DataFrameやSeriesが空であるかどうかをシンプルかつ効率的に判定するためのブール属性です。データフィルタリング後の条件分岐、エラーハンドリング、または一般的なデバッグ作業において、この属性はあなたのデータ分析ワークフローをより堅牢で安全なものにしてくれます。シンプルながらも非常に重要なこのempty属性を使いこなして、コードの信頼性を高めましょう。

