pandas DataFrameの行数・列数・サイズを取得する|shape・len・sizeの違い

pandasのDataFrameの大きさは、行数と列数をまとめて知るなら df.shape、行数だけなら len(df)、全要素数(行数×列数)なら df.size で取得します。df.size は属性なので df.size() と括弧を付けるとエラーになり、グループごとの件数を数える groupby(…).size() とは別物です。

この記事では、shape・len・size・ndim の違いと、欠損値を除いた件数(count)、メモリ上のサイズ(memory_usage)までを、実際に実行した結果つきで整理します。動作確認は Python 3.12.15・pandas 3.0.6 で行いました(2026年10月15日確認)。

早見表:行数・列数・要素数の取り方

知りたいもの 書き方 戻り値の例(4行×3列)
行数と列数 df.shape (4, 3)(タプル)
行数 len(df) または df.shape[0] 4
列数 df.shape[1] または len(df.columns) 3
全要素数 df.size 12
次元数 df.ndim 2
欠損以外の件数(列ごと) df.count() Series
グループごとの行数 df.groupby("列").size() Series
メモリ使用量 df.memory_usage(deep=True) 列ごとのバイト数

定義は pandas 公式リファレンスの DataFrame.shape と DataFrame.size に基づきます。size は「DataFrameなら行数×列数、Seriesなら行数」を返すと説明されています。

shape・len・size・ndim をまとめて試す

年齢の列に欠損値(None)を1つ含む、4行3列のDataFrameで確かめます。

import pandas as pd

df = pd.DataFrame({
    "名前": ["佐藤", "鈴木", "高橋", "田中"],
    "年齢": [25, 30, None, 40],
    "都市": ["東京", "大阪", "名古屋", "福岡"],
})

print(df.shape)     # (行数, 列数)
print(df.shape[0])  # 行数
print(df.shape[1])  # 列数
print(len(df))      # 行数
print(len(df.columns))  # 列数
print(df.size)      # 要素数 = 行数 × 列数
print(df.ndim)      # 次元数

実行結果:

(4, 3)
4
3
4
3
12
2

欠損値があっても、shape・len・size の値は変わりません。どれも「枠の数」を数えているからです。中身が入っている数を知りたいときは、後で説明する count() を使います。

shape:行数と列数をタプルで返す

df.shape は (行数, 列数) のタプルです。2つの変数に分けて受け取るとコードが読みやすくなります。

import pandas as pd

df = pd.DataFrame({
    "名前": ["佐藤", "鈴木", "高橋", "田中"],
    "年齢": [25, 30, None, 40],
    "都市": ["東京", "大阪", "名古屋", "福岡"],
})

rows, cols = df.shape
print(f"{rows}行 × {cols}列")

実行結果:

4行 × 3列

shape も size も「属性」なので、df.shape() のように括弧を付けてはいけません。

len(df):行数だけを返す

Python組み込みの len() にDataFrameを渡すと、行数(インデックスの長さ)が返ります。列数ではない点に注意してください。列数を len で求めたいときは len(df.columns) と書きます。

行数を取るだけなら len(df) と df.shape[0] のどちらでも同じ結果です。読みやすいほうを選べば十分です。

size:全要素数を返す

df.size は行数×列数です。4行×3列なら12になります。DataFrameの「サイズ」と聞いて行数を想像する人もいますが、pandasの size は要素数です。行数が欲しいときは len を使ってください。

df.size と groupby().size() の違い

「pandas .size()」と括弧付きで検索されることが多いのは、groupby の size() メソッドと混同しやすいためです。名前は同じでも、役割はまったく違います。

import pandas as pd

df = pd.DataFrame({
    "都市": ["東京", "大阪", "東京", "福岡", "東京"],
    "売上": [100, 80, 120, 60, 90],
})

print(df.size)                    # 属性:表全体の要素数
print(df.groupby("都市").size())  # メソッド:グループごとの行数

実行結果:

10
都市
大阪    1
東京    3
福岡    1
dtype: int64

df.size は属性で、表全体の要素数(5行×2列=10)を返します。df.groupby("都市").size() はメソッドで、グループごとの行数を返します(DataFrameGroupBy.size)。DataFrameに対して df.size() と書くと、整数を関数として呼び出すことになりエラーになります。

import pandas as pd

df = pd.DataFrame({"a": [1, 2, 3]})

print(df.shape, df.size)

try:
    df.size()
except TypeError as e:
    print("TypeError:", e)

実行結果:

(3, 1) 3
TypeError: 'int' object is not callable

欠損値を除いた件数は count()

shape や size は欠損値も1件として数えます。実際にデータが入っている件数を知りたいときは count() を使います。

import pandas as pd

df = pd.DataFrame({
    "名前": ["佐藤", "鈴木", "高橋", "田中"],
    "年齢": [25, 30, None, 40],
    "都市": ["東京", "大阪", "名古屋", "福岡"],
})

print(df.count())          # 列ごとの欠損でない値の数
print(df["年齢"].size)     # 欠損も含む
print(df["年齢"].count())  # 欠損を除く
print(df.notna().sum().sum())  # 表全体の欠損でない値の数

実行結果:

名前    4
年齢    3
都市    4
dtype: int64
4
3
11

年齢の列は size が4、count が3です。表全体では12要素のうち11個に値が入っていることがわかります。

空のDataFrameを判定する

条件で絞り込んだ結果が0行かどうかは、len(df) == 0 か df.empty で判定できます。

import pandas as pd

df = pd.DataFrame({"a": [1, 2, 3]})
empty = df[df["a"] > 10]

print(empty.shape, len(empty), empty.size)
print(empty.empty)

実行結果:

(0, 1) 0 0
True

if文で if df: と書くとDataFrameの真偽値があいまいだというエラーになるため、if df.empty: や if len(df) == 0: のように明示的に書きます。

メモリ上のサイズを知るには memory_usage

「サイズ」がファイルやメモリの大きさを指す場合は、memory_usage() を使います。文字列の列まで正確に測るには deep=True を付けます(DataFrame.memory_usage)。

import numpy as np
import pandas as pd

df = pd.DataFrame({
    "id": np.arange(100_000),
    "score": np.random.default_rng(0).random(100_000),
    "city": ["東京", "大阪"] * 50_000,
})

print(df.memory_usage(deep=True))
print(round(df.memory_usage(deep=True).sum() / (1024 * 1024), 2), "MB")

実行結果:

Index        132
id        800000
score     800000
city     7000000
dtype: int64
8.2 MB

数値の列は1行8バイト×10万行で800,000バイトです。文字列の列の値は、pandasのバージョンや PyArrow がインストールされているかで変わります。上の結果は PyArrow なしの環境での値なので、目安として見てください。

info() で大きさと欠損をまとめて確認する

行数・列数・列ごとの欠損以外の件数・型・メモリ使用量を一度に見たいときは info() が便利です。

import pandas as pd

df = pd.DataFrame({
    "名前": ["佐藤", "鈴木", "高橋", "田中"],
    "年齢": [25, 30, None, 40],
    "都市": ["東京", "大阪", "名古屋", "福岡"],
})
df.info()

実行結果:

<class 'pandas.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   名前      4 non-null      str    
 1   年齢      3 non-null      float64
 2   都市      4 non-null      str    
dtypes: float64(1), str(2)
memory usage: 228.0 bytes

文字列の列の型が object ではなく str と表示されているのは、pandas 3.0 から文字列専用の型が標準になったためです(pandas 3.0.0 の変更点)。pandas 2.x では同じコードでも object と表示されます。

使い分けのまとめ

  • 読み込んだデータの全体像をつかむ:df.shape、詳しく見るなら df.info()
  • ループ回数や件数チェック:len(df)
  • セルの総数:df.size
  • 中身がある件数:df.count()
  • カテゴリ別の件数:df.groupby("列").size() または df["列"].value_counts()

前処理の前後で df.shape を表示しておくと、結合や絞り込みで行が想定外に増えた・消えたことにすぐ気づけます。

pandasでのデータ分析を、つまずいたときにトレーナーへ質問しながら自分のペースで進めたい方は、通学型プログラミングスクールのテックジムも選択肢です。無料講座から始められます。

よくある質問

Q. DataFrameの行数を取得するいちばん簡単な方法は?

len(df) です。df.shape[0] でも同じ値が得られます。

Q. df.size と len(df) は何が違いますか?

len(df) は行数、df.size は行数×列数の全要素数です。3列のDataFrameなら df.size は len(df) の3倍になります。

Q. df.size() と書いたらエラーになりました。

DataFrameの size は属性なので括弧は不要です。df.size() と書くと TypeError: ‘int’ object is not callable になります。グループごとの件数を数える groupby(…).size() はメソッドなので括弧が必要です。

Q. 欠損値を除いた件数を数えるには?

列ごとなら df.count()、特定の列なら df[“列名”].count() を使います。shape、len、size は欠損値も数に含めます。

pandas|データ整形・変換の関連記事

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

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

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

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