Pandas select_dtypesでデータ型を絞り込み!必要な列だけをスマートに抽出・除外 📊


 

Pandasでデータ分析を行う際、数値データだけを対象に計算したい、あるいは文字列型の列だけを前処理したい、といった場面は頻繁にあります。そんな時に役立つのが、DataFrameから特定のデータ型(dtype)の列だけを抽出したり、除外したりできるselect_dtypes()メソッドです。このメソッドを使えば、手作業で列名を選ぶ手間が省け、コードもより簡潔で汎用的に書けるようになります。

この記事では、select_dtypes()の基本的な使い方から、数値型・オブジェクト型・日時型などの具体的な指定方法、そして除外のテクニックまでを詳しく解説します。


 

select_dtypes()とは?なぜ使うのか? 🤔

 

select_dtypes()は、DataFrameの列をそのデータ型に基づいてフィルタリングするためのメソッドです。

 

select_dtypes()を使うメリット

 

  • 自動化と汎用性: データ型を指定するだけで列を自動選択するため、列名が頻繁に変わるようなデータセットでも、コードを変更することなく対応できます。

  • コードの簡潔化: 複数の列をリストで指定する手間が省け、コードが読みやすくなります。

  • エラーの削減: 間違ったデータ型の列に対して操作を行ってしまうリスクを減らせます。


 

select_dtypes()の基本的な使い方 ✨

 

select_dtypes()は、includeまたはexclude引数を使って、含めたいデータ型と除外したいデータ型を指定します。

 

1. 特定のデータ型を含めて抽出する (include)

 

include引数には、抽出したいデータ型(またはそのリスト)を指定します。

Python
 
import pandas as pd
import numpy as np # NaNを使うため

df = pd.DataFrame({
    'ID': [1, 2, 3],
    '商品名': ['りんご', 'みかん', 'バナナ'],
    '価格': [100.5, 80.0, np.nan],
    '在庫数': [50, 120, 30],
    '発売日': pd.to_datetime(['2023-01-01', '2023-02-15', '2023-03-10']),
    '公開済み': [True, False, True]
})

print("--- 元のDataFrame ---")
print(df)
print("\n--- 元のDataFrameのdtypes ---")
print(df.dtypes)

# 数値型(intとfloat)の列を抽出
df_numbers = df.select_dtypes(include=['int64', 'float64'])
print("\n--- 数値型の列を抽出 ---")
print(df_numbers)
# ID      int64
# 価格    float64
# 在庫数     int64
# dtype: object

# オブジェクト型(文字列など)の列を抽出
df_objects = df.select_dtypes(include='object')
print("\n--- オブジェクト型の列を抽出 ---")
print(df_objects)
# 商品名    object
# dtype: object

 

2. 特定のデータ型を除外して抽出する (exclude)

 

exclude引数には、除外したいデータ型(またはそのリスト)を指定します。

Python
 
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'ID': [1, 2],
    '商品名': ['A', 'B'],
    '価格': [100.0, 200.0],
    '公開済み': [True, False]
})

# オブジェクト型を除外した列を抽出(数値型とブール型が残る)
df_no_objects = df.select_dtypes(exclude='object')
print("\n--- オブジェクト型を除外した列 ---")
print(df_no_objects)

# 数値型とブール型を除外した列を抽出(オブジェクト型と日時型などが残る)
df_non_numeric_bool = df.select_dtypes(exclude=['int64', 'float64', 'bool'])
print("\n--- 数値型とブール型を除外した列 ---")
print(df_non_numeric_bool)

 

よく使うデータ型の指定方法 📊

 

PandasやNumPyのデータ型は、様々な方法で指定できます。

 

1. NumPyのデータ型エイリアスで指定

 

NumPyの汎用的なデータ型エイリアス(例: 'number', 'object', 'datetime')を使用すると便利です。

  • 'number': すべての数値型(int, floatなど)

  • 'object': 文字列やその他のPythonオブジェクト

  • 'datetime': 日付・時刻型

  • 'bool': ブール型

  • 'category': カテゴリ型

Python
 
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Int_Col': [1, 2],
    'Float_Col': [1.1, 2.2],
    'Object_Col': ['a', 'b'],
    'Date_Col': pd.to_datetime(['2023-01-01', '2023-01-02']),
    'Bool_Col': [True, False]
})

print("\n--- NumPyエイリアスでの指定 ---")

# すべての数値型の列を抽出
df_all_numbers = df.select_dtypes(include='number')
print("\n--- 'number' を含めて抽出 ---")
print(df_all_numbers.dtypes)

# 日付・時刻型を除外
df_no_dates = df.select_dtypes(exclude='datetime')
print("\n--- 'datetime' を除外して抽出 ---")
print(df_no_dates.dtypes)

 

2. リストで複数のデータ型を指定

 

複数の特定のデータ型を含めたい(または除外したい)場合は、リスト形式で指定します。

Python
 
import pandas as pd

df = pd.DataFrame({
    'A_int': [1], 'B_float': [1.0], 'C_str': ['x'], 'D_bool': [True]
})

# int型とbool型のみを抽出
df_int_bool = df.select_dtypes(include=['int64', 'bool'])
print("\n--- int64 と bool を含めて抽出 ---")
print(df_int_bool.dtypes)

 

3. カテゴリ型を扱う

 

category型は、特にメモリ効率を考慮する際に有用です。select_dtypesでも指定できます。

Python
 
import pandas as pd

df_cat = pd.DataFrame({
    'City': ['Tokyo', 'Osaka', 'Tokyo', 'Nagoya'],
    'Population': [1000, 200, 300, 150]
})
df_cat['City'] = df_cat['City'].astype('category') # City列をカテゴリ型に変換

print("\n--- カテゴリ型のDataFrameのdtypes ---")
print(df_cat.dtypes)

# カテゴリ型の列を抽出
df_category_cols = df_cat.select_dtypes(include='category')
print("\n--- カテゴリ型の列を抽出 ---")
print(df_category_cols)

 

まとめ

 

Pandasのselect_dtypes()メソッドは、DataFrameから特定のデータ型の列を効率的に抽出または除外するための非常に便利なツールです。

  • 含めて抽出: df.select_dtypes(include=データ型)

  • 除外して抽出: df.select_dtypes(exclude=データ型)

  • データ型の指定: 個別のdtype名('int64', 'object'など)またはNumPyエイリアス('number', 'datetime'など)を単一の文字列またはリストで指定。

このメソッドを使いこなすことで、データ前処理のコードがよりスマートになり、様々なデータセットへの適用も容易になるでしょう。ぜひselect_dtypes()を積極的に活用して、データ分析ワークフローを効率化してください!