CSVやExcelを読み込むと、DataFrameにはいろいろな種類の列が混ざっていることがあります。
たとえば、次のような列です。
商品名や地域のような文字列の列売上や数量のような数値の列注文日のような日付の列キャンペーン対象のようなTrue/Falseの列
このようなデータでは、列の種類によって次に行う処理が変わります。
数値列は平均・合計・統計量の確認に使いやすく、文字列やカテゴリ列は件数集計に使いやすく、日付列は月別・曜日別の分析に使いやすいです。
つまり、データ型ごとに列を分けておくと、その後の確認・集計・分析に進みやすくなります。
そこで便利なのが、Pandasの select_dtypes() です。
select_dtypes() を使うと、列名ではなく データ型 を基準にして、数値列・文字列が入っている列・日付列などをまとめて選べます。
たとえば、数値列だけを選びたい場合は、次のように書きます。
df.select_dtypes(include="number")
この記事では、pandas select_dtypes の基本を、Google Colabでそのまま試せるサンプルデータを使って解説します。
この記事でわかること
この記事では、次の内容を学びます。
select_dtypes()でできること- データ型ごとに列を分けるメリット
dtypesやinfo()で型を確認してから列を選ぶ流れ- 数値列だけを選ぶ方法
- 文字列が入っている列だけを選ぶ方法
- 日付列だけを選ぶ方法
category型やbool型も選べることexcludeで特定の型を除外する方法
この記事のゴールは、select_dtypes() を使って、DataFrameから数値列・文字列が入っている列・日付列をデータ型ごとに選び、その後の確認・集計・分析に進みやすくすることです。
まずdtypesで型を確認してからselect_dtypes()を使う
select_dtypes() は、Pandasの前処理で 型を確認したあと に使うと便利です。
いきなり select_dtypes() を使うのではなく、まず df.dtypes や df.info() で、各列がPandas上でどのデータ型として扱われているかを確認します。
df.dtypes は、列ごとのデータ型だけを簡単に確認したいときに使います。
一方、df.info() では、データ型に加えて、行数・欠損していない値の数・メモリ使用量などもまとめて確認できます。
たとえば、次のような流れです。
- CSVやExcelを読み込む
head()でデータの中身を確認するdf.dtypesやdf.info()で列ごとのデータ型を確認する- 数字や日付に見える列が、Pandas上でどの型として扱われているか確認する
- 必要に応じて
to_numeric()、to_datetime()、astype()で型を整える select_dtypes()で、数値列・文字列が入っている列・日付列などをまとめて選ぶ
この流れにすると、「見た目は数字でも、Pandas上では文字列として扱われている」「日付に見えても、まだ日付型ではない」といった状態に気づきやすくなります。
上で確認したように、select_dtypes() のメリットは、データ型ごとに列を分けられることです。
数値列、文字列が入っている列、日付列では、次に行う処理が異なります。
そのため、先に select_dtypes() で列を種類ごとに整理しておくと、確認・集計・分析へ進みやすくなります。
ただし、型が違う列を混ぜたまま、同じ方法で集計・可視化できるわけではありません。
数値列なら統計量の確認、文字列やカテゴリ列なら件数集計、日付列なら月別・曜日別の分析のように、列の種類に合った処理を選ぶことが大切です。
この流れで出てくる基本操作が不安な場合は、以下の記事も参考になります。dtypes や info() による型の確認方法は、info()・describe()の記事で解説しています。
- Pandas DataFrame入門|作り方・基本操作をわかりやすく解説
- pandas head()の使い方|先頭行を確認してデータの中身を把握する方法
- Pandas info()とdescribe()の違い|欠損値・型・統計量の見方を例で解説
- pandas to_numeric()の使い方|文字列の数字を数値に変換する方法
- pandas to_datetime()の使い方|文字列の日付変換と format・NaT 対処を初心者向けに解説
- pandas astype()の使い方|文字列・数値への型変換とエラー対処を初心者向けに解説
select_dtypes()とは?
select_dtypes() は、DataFrameの列を データ型(dtype)で選ぶ メソッドです。
dtype は、Pandasで使われる「データ型」を表す言葉です。この記事では、基本的には「データ型」として説明します。
基本形は次のとおりです。
df.select_dtypes(include=選びたい型)
または、特定の型を除外したい場合は次のように書きます。
df.select_dtypes(exclude=除外したい型)
まず、初心者が最初に覚えるなら、次の3つで十分です。
| やりたいこと | 書き方の例 | 使う場面 |
|---|---|---|
| 数値列だけ選ぶ | df.select_dtypes(include="number") |
集計・統計量・グラフ化の前 |
| 文字列が入っている列だけ選ぶ | df.select_dtypes(include=["object", "string"]) |
カテゴリ名・地域名などの確認 |
| 日付列だけ選ぶ | df.select_dtypes(include="datetime") |
月別・曜日別の分析の前 |
ポイントは、select_dtypes() は 型を変換するメソッドではない ということです。
見た目が数字や日付のように見えても、Pandas上のデータ型が違うと、期待した列として選ばれないことがあります。
そのため、select_dtypes() を使う前後では、df.dtypes やdf.info()でデータ型を確認することが大切です。
まずはサンプルデータを作る
今回は、ネットショップの注文データをイメージしたDataFrameを使います。
このデータには、数値・文字列・日付・真偽値が混ざっています。
実際のCSVやExcelデータでも、このようにいろいろな型の列が混ざっていることがよくあります。
import pandas as pd
raw_df = pd.DataFrame({
"注文ID": [1001, 1002, 1003, 1004, 1005],
"商品名": ["ノートPC", "マウス", "キーボード", "モニター", "USBメモリ"],
"地域": ["東京", "大阪", "東京", "福岡", "大阪"],
"売上": ["120000", "3000", "8000", "35000", "不明"],
"数量": [1, 2, 1, 1, 3],
"割引率": [0.10, 0.00, 0.05, 0.15, 0.00],
"注文日": ["2026-05-01", "2026-05-02", "2026-05-03", "2026-05-04", "2026-05-05"],
"キャンペーン対象": [True, False, True, True, False],
"メモ": ["初回購入", "リピート", "法人", "初回購入", "リピート"]
})
raw_df
| 注文ID | 商品名 | 地域 | 売上 | 数量 | 割引率 | 注文日 | キャンペーン対象 | メモ | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1001 | ノートPC | 東京 | 120000 | 1 | 0.10 | 2026-05-01 | True | 初回購入 |
| 1 | 1002 | マウス | 大阪 | 3000 | 2 | 0.00 | 2026-05-02 | False | リピート |
| 2 | 1003 | キーボード | 東京 | 8000 | 1 | 0.05 | 2026-05-03 | True | 法人 |
| 3 | 1004 | モニター | 福岡 | 35000 | 1 | 0.15 | 2026-05-04 | True | 初回購入 |
| 4 | 1005 | USBメモリ | 大阪 | 不明 | 3 | 0.00 | 2026-05-05 | False | リピート |
上のデータでは、売上 は数字のように見えます。
しかし、最後に "不明" という文字が入っているため、この時点では数値列として扱えない可能性があります。
まずは、dtypes で列ごとの型を確認してみましょう。
raw_df.dtypes
| dtype | |
|---|---|
| 注文ID | int64 |
| 商品名 | object |
| 地域 | object |
| 売上 | object |
| 数量 | int64 |
| 割引率 | float64 |
| 注文日 | object |
| キャンペーン対象 | bool |
| メモ | object |
dtypes を見ると、列ごとのデータ型を確認できます。
同じように、info() でも各列のデータ型は Dtype として確認できます。
ここで大切なのは、見た目が数字かどうかではなく、Pandasがどの型として認識しているか です。
たとえば、売上 は数字に見えますが、"不明" が混ざっているため、数値ではなく object 型として扱われています。
では、この状態で数値列だけを選ぶとどうなるか確認してみましょう。
まずは変換前のデータで数値列だけを選んでみる
数値列だけを選びたい場合は、include="number" を指定します。
まずは、型を変換する前の raw_df で数値列だけを選んでみます。
raw_df.select_dtypes(include="number")
| 注文ID | 数量 | 割引率 | |
|---|---|---|---|
| 0 | 1001 | 1 | 0.10 |
| 1 | 1002 | 2 | 0.00 |
| 2 | 1003 | 1 | 0.05 |
| 3 | 1004 | 1 | 0.15 |
| 4 | 1005 | 3 | 0.00 |
実行結果を見ると、注文ID、数量、割引率 は選ばれますが、売上 は含まれていません。
理由は、売上 がPandas上では数値型ではなく object 型として扱われているためです。
このように、数字に見える列でも、データ型が文字列系のままだと include="number" では選ばれません。
売上 を数値列として扱いたい場合は、先に to_numeric() で数値型に変換します。
売上を数値型に変換する
ここでは、売上 を数値列として扱えるようにします。
売上 には "不明" が混ざっているため、そのままでは数値型にできません。
そこで、pd.to_numeric() の errors="coerce" を使い、数値に変換できない値を NaN にします。
数値変換の詳しい使い方は、以下の記事で解説しています。
df = raw_df.copy()
df["売上"] = pd.to_numeric(df["売上"], errors="coerce")
df
| 注文ID | 商品名 | 地域 | 売上 | 数量 | 割引率 | 注文日 | キャンペーン対象 | メモ | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1001 | ノートPC | 東京 | 120000.0 | 1 | 0.10 | 2026-05-01 | True | 初回購入 |
| 1 | 1002 | マウス | 大阪 | 3000.0 | 2 | 0.00 | 2026-05-02 | False | リピート |
| 2 | 1003 | キーボード | 東京 | 8000.0 | 1 | 0.05 | 2026-05-03 | True | 法人 |
| 3 | 1004 | モニター | 福岡 | 35000.0 | 1 | 0.15 | 2026-05-04 | True | 初回購入 |
| 4 | 1005 | USBメモリ | 大阪 | NaN | 3 | 0.00 | 2026-05-05 | False | リピート |
売上 の "不明" は、errors="coerce" によって NaN になりました。
これは「数値に変換できない値を欠損値として扱う」という意味です。
今回は学習用の例として "不明" を NaN に変換しています。
実務では、"不明" が本当に欠損値として扱ってよい値なのかを確認してから処理しましょう。
次に、型がどう変わったか確認します。
df.dtypes
| dtype | |
|---|---|
| 注文ID | int64 |
| 商品名 | object |
| 地域 | object |
| 売上 | float64 |
| 数量 | int64 |
| 割引率 | float64 |
| 注文日 | object |
| キャンペーン対象 | bool |
| メモ | object |
これで、売上 は数値型として扱えるようになりました。
もう一度、select_dtypes(include="number") で数値列だけを選んでみましょう。
変換後に数値列だけを選ぶ:include=”number”
売上 を数値型に変換したあとであれば、include="number" で数値列として選ばれるようになります。
numeric_df = df.select_dtypes(include="number")
numeric_df
| 注文ID | 売上 | 数量 | 割引率 | |
|---|---|---|---|---|
| 0 | 1001 | 120000.0 | 1 | 0.10 |
| 1 | 1002 | 3000.0 | 2 | 0.00 |
| 2 | 1003 | 8000.0 | 1 | 0.05 |
| 3 | 1004 | 35000.0 | 1 | 0.15 |
| 4 | 1005 | NaN | 3 | 0.00 |
この結果では、注文ID、売上、数量、割引率 のような数値型の列だけが残ります。
一方で、商品名、地域、注文日、メモ などは数値型ではないため、この結果には含まれません。
また、キャンペーン対象 のような True / False の列はbool型として扱われるため、ここでは数値列とは分けて考えるとわかりやすいです。
ただし、注文ID のようなID列も数値型なので、include="number" で選ばれます。
ここは初心者が特に注意したいポイントです。
数値型の列として選ばれること と、平均・合計などの分析対象として意味があること は同じではありません。
たとえば、注文ID は数値型ですが、平均値や合計を出しても分析上の意味は薄いです。
そのため、include="number" で数値列をまとめて選んだあとでも、ID列のように分析対象にしない列は、目的に応じて除外しましょう。
numeric_df.describe()
| 注文ID | 売上 | 数量 | 割引率 | |
|---|---|---|---|---|
| count | 5.000000 | 4.000000 | 5.000000 | 5.000000 |
| mean | 1003.000000 | 41500.000000 | 1.600000 | 0.060000 |
| std | 1.581139 | 54187.944539 | 0.894427 | 0.065192 |
| min | 1001.000000 | 3000.000000 | 1.000000 | 0.000000 |
| 25% | 1002.000000 | 6750.000000 | 1.000000 | 0.000000 |
| 50% | 1003.000000 | 21500.000000 | 1.000000 | 0.050000 |
| 75% | 1004.000000 | 56250.000000 | 2.000000 | 0.100000 |
| max | 1005.000000 | 120000.000000 | 3.000000 | 0.150000 |
describe() を使うと、数値列の件数、平均、最小値、最大値などを確認できます。
より詳しく describe() の見方を確認したい場合は、以下の記事も参考になります。
文字列が入っている列だけを選ぶ:include=[“object”, “string”]
文字列が入っている列だけを選びたい場合は、include=["object", "string"] のように指定します。
Pandasでは、文字列が object 型として扱われることもあれば、string 型として扱われることもあります。
初心者のうちは、厳密な違いまで深入りしすぎず、まずは 文字列っぽい列を選ぶときは object と string を意識する と覚えておくとよいです。
なお、pandasのバージョンによって、文字列が入っている列のデータ型の表示や選び方が少し変わる場合があります。
うまく選べないときは、まず df.dtypes で実際のデータ型を確認してください。
text_df = df.select_dtypes(include=["object", "string"])
text_df
| 商品名 | 地域 | 注文日 | メモ | |
|---|---|---|---|---|
| 0 | ノートPC | 東京 | 2026-05-01 | 初回購入 |
| 1 | マウス | 大阪 | 2026-05-02 | リピート |
| 2 | キーボード | 東京 | 2026-05-03 | 法人 |
| 3 | モニター | 福岡 | 2026-05-04 | 初回購入 |
| 4 | USBメモリ | 大阪 | 2026-05-05 | リピート |
この例では、商品名、地域、注文日、メモ などが選ばれます。
ここで 注文日 も選ばれるのは、まだ to_datetime() で日付型に変換していないためです。
見た目が日付でも、Pandas上で文字列として扱われていれば、文字列系の列として選ばれます。
文字列が入っている列だけを取り出すと、value_counts() で種類ごとの件数を確認しやすくなります。
object型を選ぶときの注意
文字列が入っている列を選びたいときは、次のように書けます。
df.select_dtypes(include=["object", "string"])
ただし、object 型は「文字列専用の型」ではありません。
CSVやExcelを読み込んだデータでは、商品名・地域名・メモのような文字列列が object 型になることが多いです。
しかし、object 型には、文字列だけでなく、リストや辞書などのPythonオブジェクトが入ることもあります。
そのため、文字列列だけを正確に扱いたい場合は、まず df.dtypes で型を確認し、必要に応じて astype("string") で文字列型に整えてから使うと安心です。
df["商品名"] = df["商品名"].astype("string")
select_dtypes() は便利ですが、最初に df.dtypes で列ごとの型を確認してから使うのが基本です。
df["メモ"].value_counts()
| count | |
|---|---|
| 初回購入 | 2 |
| リピート | 2 |
| 法人 | 1 |
value_counts() は、カテゴリ名や文字列の出現回数を数えるときに便利です。
たとえば、地域別、商品名別、メモの種類別などを確認したいときに使えます。
詳しくは、以下の記事で解説しています。
日付列だけを選ぶ:include=”datetime”
日付列だけを選びたい場合は、include="datetime" を指定します。
ただし、見た目が日付の文字列でも、Pandas上で日付型になっていなければ選ばれません。
今回の 注文日 も、ここまでは文字列のままです。
そのため、日付列として選ぶ前に、to_datetime() で日付型に変換します。
to_datetime() の詳しい使い方は、以下の記事で解説しています。
df["注文日"] = pd.to_datetime(df["注文日"])
date_df = df.select_dtypes(include="datetime")
date_df
| 注文日 | |
|---|---|
| 0 | 2026-05-01 |
| 1 | 2026-05-02 |
| 2 | 2026-05-03 |
| 3 | 2026-05-04 |
| 4 | 2026-05-05 |
日付列を選べるようになると、月別集計や曜日別集計などに進みやすくなります。
なお、日付列から年・月・曜日を取り出す方法は、以下の記事で詳しく解説しています。
補足:category列やbool列も選べる
select_dtypes() では、数値列・文字列が入っている列・日付列だけでなく、カテゴリ型や真偽値型の列も選べます。
たとえば、カテゴリ型の列を選ぶ場合は include="category"、True / False のような真偽値列を選ぶ場合は include="bool" を使います。
ただし、初心者のうちは、まず include="number"、include=["object", "string"]、include="datetime" の3つを優先して覚えれば十分です。
category や bool は、必要になったときに補足として使うくらいで問題ありません。
category 型への変換は astype("category") で行えますが、詳しい型変換は以下の記事で解説しています。
excludeで特定の型を除外する
include は「この型を選ぶ」という指定です。
一方で、exclude は「この型を除外する」という指定です。
たとえば、数値列以外を選びたい場合は、次のように書けます。
non_numeric_df = df.select_dtypes(exclude="number")
non_numeric_df
| 商品名 | 地域 | 注文日 | キャンペーン対象 | メモ | |
|---|---|---|---|---|---|
| 0 | ノートPC | 東京 | 2026-05-01 | True | 初回購入 |
| 1 | マウス | 大阪 | 2026-05-02 | False | リピート |
| 2 | キーボード | 東京 | 2026-05-03 | True | 法人 |
| 3 | モニター | 福岡 | 2026-05-04 | True | 初回購入 |
| 4 | USBメモリ | 大阪 | 2026-05-05 | False | リピート |
exclude="number" を指定すると、数値型の列が除外されます。
ただし、初心者のうちは、まず include を中心に使うのがおすすめです。
exclude は、慣れてきてから「数値列以外をまとめて確認したい」ときに使うとよいでしょう。
select_dtypes()で次の処理に進みやすくする
select_dtypes() で列をデータ型ごとに分けておくと、その後の処理に進みやすくなります。
たとえば、数値列は統計量の確認、文字列やカテゴリ列は件数集計、日付列は日付を使った分析に向いています。
この記事では詳しい集計や可視化には深入りせず、「分析に使う列をデータ型ごとに整理する」ところまでを押さえます。
- pandas value_counts()の使い方|件数集計・割合表示・欠損値の数え方を解説
- Pandas groupby×aggの使い方|基本の集計とaggの書き方を例で解説
- Matplotlib ヒストグラム&箱ひげ図 入門|bins設定と外れ値の可視化・分析
まとめ
この記事では、pandas select_dtypes の使い方を解説しました。
select_dtypes() は、DataFrameの中から データ型を基準に列を選ぶ メソッドです。
基本は、次のように覚えると十分です。
| やりたいこと | 書き方 |
|---|---|
| 数値列だけ選ぶ | df.select_dtypes(include="number") |
| 文字列が入っている列だけ選ぶ | df.select_dtypes(include=["object", "string"]) |
| 日付列だけ選ぶ | df.select_dtypes(include="datetime") |
| 真偽値列だけ選ぶ | df.select_dtypes(include="bool") |
| 数値列以外を選ぶ | df.select_dtypes(exclude="number") |
category 型の列を選びたい場合は、include="category" も使えます。
ただし、初心者のうちは、まず数値列・文字列が入っている列・日付列を選べれば十分です。
注意したいのは、select_dtypes() は 型を変換するメソッドではない という点です。
数字に見える列や日付に見える列でも、Pandas上のデータ型が違えば選ばれないことがあります。
うまく選べないときは、まず df.dtypes や df.info() で型を確認しましょう。
必要に応じて、数値なら to_numeric()、日付なら to_datetime()、文字列型やカテゴリ型への変換なら astype() で型を整えてから、select_dtypes() を使います。
データ型を確認し、必要に応じて型を整えたうえで select_dtypes() を使うと、列の種類に合った次の処理へ進みやすくなります。
pandasで数値列だけ抽出するにはどうすればよいですか?
数値列だけ抽出したい場合は、次のように書きます。df.select_dtypes(include="number")
数字に見える列でも object 型になっている場合は選ばれないため、必要に応じて to_numeric() で数値型に変換します。
pandasで文字列が入っている列だけ選ぶにはどうすればよいですか?
文字列が入っている列だけを選びたい場合は、次のように書きます。df.select_dtypes(include=["object", "string"])
うまく選べないときは、まず df.dtypes で実際のデータ型を確認しましょう。
日付列だけを選ぶことはできますか?
できます。日付型の列だけを選ぶ場合は、次のように書きます。df.select_dtypes(include="datetime")
見た目が日付でも文字列のままでは選ばれないため、必要に応じて to_datetime() で日付型に変換します。
select_dtypes()で型は変換できますか?
できません。select_dtypes() は、データ型を基準に列を選ぶメソッドです。
型を変換したい場合は、to_numeric()、to_datetime()、astype() などを使います。
うまく列が選ばれないときは何を確認すればよいですか?
まずは、df.dtypes または df.info() でPandas上のデータ型を確認しましょう。
数字に見える列が object 型のままだと include="number" では選ばれません。
日付に見える列が文字列型のままだと include="datetime" では選ばれません。
includeとexcludeを同時に使うときの注意はありますか?
include と exclude は同時に使えます。
たとえば、数値列を選びつつ、整数型だけを除外したい場合は次のように書けます。df.select_dtypes(include="number", exclude="int64")
ただし、include と exclude に同じ型を指定するとエラーになります。df.select_dtypes(include="number", exclude="number")
初心者のうちは、まず include だけで必要な型を選ぶ使い方から覚えるのがおすすめです。
慣れてきたら、不要な型を外したい場面で exclude を使うとよいでしょう。
コメント