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|データ整形・変換の関連記事

並べ替え・型変換・行列の追加削除など、データの形を整える操作の記事です。

pandas全体の使い方は「pandasの使い方を初心者向けに解説」でまとめています。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら