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 DataFrameに行や列を追加する方法
- Pandas DataFrameの行名・列名を変更する方法
- DataFrameでforループ処理!iterrows, itertuples, itemsを使いこなそう
- DataFrameの行と列を入れ替える(転置)方法 Tとtranspose()
- リストをDataFrameの要素として格納し、効率的に処理する方法
- Pandas DataFrameの行・列を削除!drop()メソッドでデータを整理
pandas全体の使い方は「pandasの使い方を初心者向けに解説」でまとめています。




