pandasのemptyでDataFrame・Seriesが空か判定する方法|len・shapeとの違いとNaNの扱い
pandasでDataFrameやSeriesが空かどうかは、df.emptyで判定します。行または列のどちらかが0件ならTrue、1件でもデータがあればFalseを返し、NaNだけが入っている場合は空とはみなされません。
この記事では、empty属性の基本、if df:と書くとエラーになる理由、len()やshapeとの違い、NaNだけのデータを「空」として扱いたいときの書き方までを、実際に動かした結果つきで説明します。動作確認はPython 3.12.15、pandas 3.0.6、NumPy 2.5.4で行いました(2026年10月15日確認)。
結論:空判定は df.empty を使う
emptyはメソッドではなく属性(プロパティ)なので、かっこを付けずにdf.emptyと書きます。pandasの公式リファレンスでは、「どちらかの軸の長さが0なら空(True)」と定義されています。
| 状態 | 例 | emptyの結果 |
|---|---|---|
| 何もない | pd.DataFrame() |
True |
| 列名だけあって行が0件 | pd.DataFrame(columns=["A", "B"]) |
True |
| 行(インデックス)だけあって列が0件 | pd.DataFrame(index=[0, 1, 2]) |
True |
| NaNだけが入っている | pd.DataFrame({"A": [np.nan, np.nan]}) |
False |
| データが1件以上ある | pd.DataFrame({"A": [1, 2]}) |
False |
emptyの基本的な使い方
空のDataFrame・Seriesを判定する
import pandas as pd
import numpy as np
df_empty = pd.DataFrame()
print(df_empty.empty)
s_empty = pd.Series()
print(s_empty.empty)
print(s_empty.dtype)
実行結果:
True
True
object
引数なしのpd.Series()は、警告なしでdtypeがobjectの空のSeriesになります。
データが入っている場合
import pandas as pd
df = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
s = pd.Series([10, 20, 30])
print(df.empty)
print(s.empty)
実行結果:
False
False
「列はあるのに空」「行はあるのに空」に注意
emptyは「要素が1つもないか」を見ています。DataFrameは行×列の表なので、どちらかが0件なら要素数も0になり、Trueになります。
import pandas as pd
# 列だけあって行が0件
df_cols = pd.DataFrame(columns=["A", "B"])
print(df_cols.empty, df_cols.shape)
# 行(インデックス)だけあって列が0件
df_rows = pd.DataFrame(index=[0, 1, 2])
print(df_rows.empty, df_rows.shape)
print(len(df_rows))
実行結果:
True (0, 2)
True (3, 0)
3
2つ目の例では、emptyはTrueなのにlen(df_rows)は3です。len()は行数しか数えないため、列が0件のDataFrameを「データあり」と誤判定します。空判定にlen(df) == 0を使うと、このケースで結果が食い違います。
if df: と書くとエラーになる理由
Pythonのリストならif my_list:で空かどうかを判定できますが、DataFrameやSeriesでは同じ書き方はできません。
import pandas as pd
df = pd.DataFrame({"A": [1, 2]})
try:
if df:
print("データあり")
except ValueError as e:
print("ValueError:", e)
実行結果:
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
DataFrameを真偽値にするとき、「空でないこと」なのか「全部がTrueであること」なのか「どれかがTrueであること」なのかが決まらないため、pandasはエラーにしています。エラーメッセージにもあるとおり、空かどうかを知りたいならa.emptyを使います。なお、メッセージに出てくるa.bool()は、今回確認したpandas 3.0.6ではDataFrameのメソッドとして存在しません(hasattr(pd.DataFrame, "bool")がFalse)。古い記事でdf.bool()を見かけても、空判定には使わないでください。
フィルタリング後の空判定(よくある使い方)
条件で絞り込んだ結果が0件になることはよくあります。後続の処理に進む前にemptyで分岐させます。
import pandas as pd
df = pd.DataFrame({"商品名": ["りんご", "みかん", "バナナ"], "価格": [100, 120, 80]})
for limit in [90, 200]:
result = df[df["価格"] > limit]
if result.empty:
print(f"{limit}円より高い商品はありません")
else:
print(f"{limit}円より高い商品: {len(result)}件")
print(result)
実行結果:
90円より高い商品: 2件
商品名 価格
0 りんご 100
1 みかん 120
200円より高い商品はありません
空のまま集計するとNaNが返る
空のDataFrameにmean()を実行してもエラーにはならず、NaNが返ります。エラーが出ないぶん、気づかないまま後続の計算に紛れ込むことがあります。関数の入口でemptyをチェックしておくと安全です。
import pandas as pd
def average_price(df):
if df.empty:
return None
return df["価格"].mean()
df = pd.DataFrame({"商品名": ["りんご", "みかん"], "価格": [100, 120]})
print(average_price(df))
print(average_price(df[df["価格"] > 500]))
print(df[df["価格"] > 500]["価格"].mean())
実行結果:
110.0
None
nan
NaNだけのデータを「空」として扱いたいとき
公式リファレンスのNotesにあるとおり、NaNしか入っていないDataFrameは空とはみなされません。欠損値を除いたうえで空かどうかを見たい場合は、dropna()してからemptyを確認します。
import pandas as pd
import numpy as np
df_nan = pd.DataFrame({"A": [np.nan, np.nan]})
print(df_nan.empty)
print(df_nan.dropna().empty)
print(df_nan.isna().all().all())
実行結果:
False
True
True
「要素はあるが全部が欠損値か」を知りたいときは、3行目のようにisna().all().all()でも確認できます。
CSVを読み込んだ結果が空のとき
ヘッダー行だけのCSVを読み込むと、列名だけを持つ空のDataFrameになり、emptyはTrueです。一方、ファイルの中身が完全に空だと、読み込みの時点でEmptyDataErrorが発生します。
import pandas as pd
import io
csv_text = "商品名,価格\n"
df = pd.read_csv(io.StringIO(csv_text))
print(df.empty, df.columns.tolist())
try:
pd.read_csv(io.StringIO(""))
except pd.errors.EmptyDataError as e:
print("EmptyDataError:", e)
実行結果:
True ['商品名', '価格']
EmptyDataError: No columns to parse from file
外部ファイルを読み込む処理では、emptyのチェックとEmptyDataErrorの例外処理の両方を用意しておくと、どちらのケースにも対応できます。
empty・len・shape・sizeの違い
import pandas as pd
df = pd.DataFrame({"A": [1, 2]})
print(df.empty, len(df) == 0, df.shape[0] == 0, df.size == 0)
df0 = df.iloc[0:0]
print(df0.empty, len(df0) == 0, df0.shape[0] == 0, df0.size == 0)
実行結果:
False False False False
True True True True
行を0件にしたケースでは4つとも同じ結果ですが、前述のとおり「列が0件」のDataFrameではlen()とshape[0]だけが異なる結果になります。
| 書き方 | 見ているもの | 列が0件のDataFrame | 向いている場面 |
|---|---|---|---|
df.empty |
要素が1つもないか | True(空) | 空判定全般。意図が読み手に伝わりやすい |
df.size == 0 |
要素数(行数×列数) | True(空) | emptyと同じ判定。要素数そのものも使うとき |
len(df) == 0 |
行数 | False(空でない) | 「行が0件か」だけを見たいとき |
df.shape[0] == 0 |
行数 | False(空でない) | 行数と列数を別々に確認したいとき |
行数や列数の取り方は「pandas DataFrameの行数・列数・サイズを取得する|shape・len・sizeの違い」で詳しく説明しています。
よくある質問
Q. df.empty() とかっこを付けるとどうなりますか?
emptyは属性なので、df.empty() と書くと bool 型を呼び出そうとして TypeError になります。かっこを付けずに df.empty と書きます。
Q. Seriesにもemptyはありますか?
あります。Seriesでも s.empty と書き、要素が1つもなければ True を返します。pd.Series() で作った空のSeriesは True です。
Q. NaNしか入っていないDataFrameは空と判定されますか?
されません。NaNも要素として数えられるため empty は False です。欠損値を除いて判定したいときは df.dropna().empty を使います。
Q. len(df) == 0 と df.empty はどちらを使うべきですか?
空判定には df.empty が向いています。len(df) は行数だけを返すため、行はあるが列が0件のDataFrameを空と判定できません。
まとめ
pandasの空判定はdf.empty(Seriesならs.empty)が基本です。行・列のどちらかが0件ならTrueになり、NaNだけのデータはFalseです。if df:はエラーになり、len(df) == 0は列が0件のケースを見落とすので、迷ったらemptyを使ってください。
pandasを独学していて、エラーの意味がわからず手が止まることがあるなら、通学型のプログラミングスクール「テックジム」でトレーナーに質問しながら進める方法もあります。まずは無料講座から試せます。
pandas|データ整形・変換の関連記事
並べ替え・型変換・行列の追加削除など、データの形を整える操作の記事です。
- map, apply, applymapを使いこなしてデータ処理を効率化しよう
- Pandas apply 徹底解説: 効率的なデータ操作をマスターしよう
- Pandas DataFrame徹底解説:構造理解から作成までをマスター
- pandas DataFrameの行数・列数・サイズを取得する|shape・len・sizeの違い
- Pandas DataFrameに行や列を追加する方法
- Pandas DataFrameの行名・列名を変更する方法
pandas全体の使い方は「pandasの使い方を初心者向けに解説」でまとめています。






