Pandasを使用したデータ分析において、まず最初に行うべき作業は「データの全体像を正確に把握すること」です。
読み込んだデータがどのような型で構成されているのか、そして何行のデータが存在するのかを確認する工程は、その後の前処理や分析結果の精度を左右する極めて重要なステップです。
型が適切でないために計算エラーが発生したり、想定外の欠損値によって行数が不足していたりすることは珍しくありません。
本記事では、Pandasでデータ型と行数を確認するための標準的な手法であるinfo()、dtypes、len()などの使い分けについて、実務的な視点から詳しく解説します。
Pandasでデータ型と行数を把握すべき理由
データ分析のプロジェクトにおいて、生データが最初から完璧に整っていることは稀です。
多くの場合、数値として扱うべき列が文字列型(object型)として読み込まれていたり、日付データが単なるテキストとして認識されていたりします。
このような状態のまま処理を進めると、統計量の計算や時系列分析の段階で予期せぬ不具合を招くことになります。
また、行数の確認も同様に重要です。
データのマージ(結合)を行った際に意図せず行数が増減していないか、あるいは欠損値を除去した結果、分析に必要なサンプルサイズが維持されているかを常に監視する必要があります。
データ型と行数の確認は、いわばデータの健康診断であり、分析の信頼性を担保するための必須作業と言えます。
データ型(Dtype)を確認する主要なメソッド
Pandasには、DataFrameやSeriesのデータ型を確認するための便利なメソッドが用意されています。
用途に応じてこれらを使い分けることで、効率的にデータ構造を把握できます。
df.info() による詳細なメタデータの取得
データ全体の概要を把握したい場合に最も頻繁に使用されるのがinfo()メソッドです。
このメソッドは、データ型だけでなく、各列の非欠損値(Non-Null)の数やメモリ使用量までを一度に表示してくれます。
import pandas as pd
import numpy as np
# サンプルデータの作成
data = {
'user_id': [101, 102, 103, 104, 105],
'user_name': ['田中', '佐藤', '鈴木', '高橋', None],
'age': [25, 30, np.nan, 45, 22],
'is_active': [True, False, True, True, False],
'joined_date': pd.to_datetime(['2024-01-10', '2024-02-15', '2024-03-20', '2024-04-25', '2024-05-30'])
}
df = pd.DataFrame(data)
# データ情報の表示
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 user_id 5 non-null int64
1 user_name 4 non-null object
2 age 4 non-null float64
3 is_active 5 non-null bool
4 joined_date 5 non-null datetime64[ns]
dtypes: bool(1), datetime64[ns](1), float64(1), int64(1), object(1)
memory usage: 293.0+ bytes
info()の優れた点は、欠損値の有無が一目でわかることです。
例えば上記の例では、user_nameとageの「Non-Null Count」が「4 non-null」となっており、全5行のうち1行が欠損していることが即座に判断できます。
df.dtypes による一覧確認
データの属性情報としての「型」のみに焦点を当てたい場合は、dtypes属性を参照します。
これはメソッドではなく属性であるため、丸括弧を付けずに呼び出します。
# データ型のみを確認
print(df.dtypes)
user_id int64
user_name object
age float64
is_active bool
joined_date datetime64[ns]
dtype: object
dtypesの結果はPandasのSeries型で返されるため、df.dtypes['age']のようにして特定の列の型をプログラム内で判定に使う際にも便利です。
特定の列の型を確認する方法
特定の列(Series)に対して型を確認したい場合は、その列を指定してからdtype属性(単数形)を使用します。
# 特定の列の型を確認
target_type = df['user_id'].dtype
print(f"user_id列の型: {target_type}")
user_id列の型: int64
行数・データ件数を確認する主要なメソッド
次に、データの規模を把握するために欠かせない「行数」の確認方法について解説します。
Pandasでは複数の方法で行数を取得できますが、それぞれ挙動が異なります。
len() 関数による高速な行数取得
Pythonの組み込み関数であるlen()をDataFrameに対して使用すると、純粋な行数を返します。
これは最もシンプルで高速な方法です。
# 行数の取得
row_count = len(df)
print(f"データの総行数: {row_count}")
データの総行数: 5
len()は、欠損値が含まれていても、インデックスが不連続であっても、単純に「データが何行存在するか」のみを返します。
df.shape による行列サイズの把握
df.shapeは、DataFrameの「(行数, 列数)」をタプル形式で保持している属性です。
行数だけでなく、列数も同時に知りたい場合に非常に有用です。
# 行列サイズの取得
shape = df.shape
print(f"形状(行, 列): {shape}")
print(f"行数のみ: {shape[0]}")
print(f"列数のみ: {shape[1]}")
形状(行, 列): (5, 5)
行数のみ: 5
列数のみ: 5
コード内で「行数」を数値として利用したい場合は、df.shape[0]と記述するのが一般的です。
df.count() による有効データの計数
注意が必要なのがcount()メソッドです。
これは欠損値(NaN/None)を除外した「有効なデータ件数」を列ごとにカウントします。
# 各列の有効データ件数を確認
print(df.count())
user_id 5
user_name 4
age 4
is_active 5
joined_date 5
dtype: int64
len(df)の結果とdf.count()の結果が一致しない場合、その列には欠損値が含まれていることを意味します。
データの欠落具合を調査する際には、これらを比較することが定石です。
実践:データクリーニング前の型・件数チェックフロー
実務でデータを読み込んだ直後に行うべき推奨フローを整理します。
- 全体像の把握: まずは
df.info()で型と欠損値の概況を見ます。 - 行数の記録:
len(df)で元のデータ件数をメモしておきます。 - 特定の型への変換: 数値であるべき列が
object型になっている場合、pd.to_numeric()などで変換を試みます。 - 事後確認: 変換後、再度
df.dtypesで意図した型になっているか確認します。
以下に、不適切な型を修正し、行数を確認する一連のコード例を示します。
# 数値が文字列として入っている汚れたデータの例
dirty_data = {
'product_id': ['A01', 'A02', 'A03'],
'price': ['1200', '1500', 'invalid'] # 文字列混入
}
df_dirty = pd.DataFrame(dirty_data)
# 1. 変換前の型確認
print("--- 変換前 ---")
print(df_dirty.dtypes)
# 2. price列を数値型に変換(エラーは欠損値にする)
df_dirty['price'] = pd.to_numeric(df_dirty['price'], errors='coerce')
# 3. 変換後の型と有効行数の確認
print("\n--- 変換後 ---")
print(df_dirty.dtypes)
print(f"有効な価格データの件数: {df_dirty['price'].count()}")
--- 変換前 ---
product_id object
price object
dtype: object
--- 変換後 ---
product_id object
price float64
dtype: object
有効な価格データの件数: 2
この例では、invalidという文字列が含まれていたためにobject型として認識されていた列を、強制的に数値型(float64)へ変換しています。
変換不能な値はNaNに置き換わるため、count()の結果が「2」となり、1件の異常データがあったことが定量的に把握できます。
特定のデータ型を抽出・変換するテクニック
データ型の確認ができるようになると、次に必要となるのが「特定の型を持つ列だけを操作する」手法です。
Pandasには、特定の型に基づいて列を選択するselect_dtypes()という強力なメソッドがあります。
select_dtypes による列のフィルタリング
例えば、数値データのみに対してスケーリング処理を行いたい場合や、カテゴリカル変数(文字列型)に対してのみエンコーディングを行いたい場合に活用します。
# 数値型の列(int64, float64など)のみを抽出
numeric_df = df.select_dtypes(include=['number'])
print("数値列の一覧:")
print(numeric_df.columns)
# 文字列型(object型)の列のみを抽出
object_df = df.select_dtypes(include=['object'])
print("\n文字列列の一覧:")
print(object_df.columns)
数値列の一覧:
Index(['user_id', 'age'], dtype='object')
文字列列の一覧:
Index(['user_name'], dtype='object')
このように、includeやexclude引数を用いることで、データ型に応じた柔軟な一括処理が可能になります。
astype による明示的な型変換
確認したデータ型が適切でない場合、astype()を用いて明示的に型を変更することができます。
# user_idを文字列型(string)に変更
df['user_id'] = df['user_id'].astype(str)
# 型が変更されたか確認
print(df['user_id'].dtype)
object
※注:最新のPandas環境(2026年現在の推奨環境)では、文字列専用のstring型(Arrowバックエンドなど)を使用することも増えていますが、基本的にはobjectまたはstringとして扱われます。
| メソッド/属性 | 用途 | 出力形式 | 主なメリット |
|---|---|---|---|
df.info() | データ全体の概要把握 | テキスト(標準出力) | 型、欠損値、メモリを一度に確認できる |
df.dtypes | 列ごとの型一覧 | Series | プログラム内での型判定に使いやすい |
len(df) | 総行数の取得 | 整数 (int) | 最も高速でシンプル |
df.shape | 行列サイズの取得 | タプル (行, 列) | 行数と列数を同時に取得できる |
df.count() | 非欠損値の数 | Series | 列ごとの実データの埋まり具合がわかる |
まとめ
Pandasでのデータ分析は、まずデータの型と行数を正しく把握することから始まります。
- データの概要を俯瞰したいときは
df.info() - 列ごとのデータ型をプログラムで扱いたいときは
df.dtypes - 単純な行数を知りたいときは
len(df) - 行数と列数の両方が必要なときは
df.shape - 欠損値を除いた実データ数を確認したいときは
df.count()
これらの手法を適切に使い分けることで、データ読み込み直後のミスを防ぎ、より堅牢な分析パイプラインを構築することが可能になります。
特に大規模なデータを扱う際には、意図しないデータ型によるメモリ消費の増大にも注意を払い、常にinfo()などでリソース状況を確認する習慣をつけましょう。
一見地味な「型の確認」と「行数の確認」こそが、データサイエンスにおける品質管理の土台となるのです。
