pandas.DataFrameから特定の型dtypeの列を抽出(選択)

pandas.DataFrameは列ごとにデータ型dtypeを保持しています。 特定のデータ型dtypeの列だけを抽出(選択)するにはpandas.DataFrameのメソッドselect_dtypes()を使います。

pandas.DataFrame.select_dtypes — pandas 0.23.0 documentation

以下の様々なデータ型の列をもつpandas.DataFrameを例とします。

import pandas as pd

df = pd.DataFrame({'a': [1, 2, 1, 3],
                   'b': [0.4, 1.1, 0.1, 0.8],
                   'c': ['X', 'Y', 'X', 'Z'],
                   'd': [[0, 0], [0, 1], [1, 0], [1, 1]],
                   'e': [True, True, False, True]})

df['f'] = pd.to_datetime(['2018-01-01', '2018-03-15', '2018-02-20', '2018-03-15'])

print(df)
#    a    b  c       d      e          f
# 0  1  0.4  X  [0, 0]   True 2018-01-01
# 1  2  1.1  Y  [0, 1]   True 2018-03-15
# 2  1  0.1  X  [1, 0]  False 2018-02-20
# 3  3  0.8  Z  [1, 1]   True 2018-03-15

print(df.dtypes)
# a             int64
# b           float64
# c            object
# d            object
# e              bool
# f    datetime64[ns]
# dtype: object

ここでは以下の内容について説明します。

select_dtypes()の基本的な使い方 抽出する型を指定: 引数include 除外する型を指定: 引数exclude

pandasのデータ型dtypeおよび型変換(キャスト)のためのastype()メソッドについては以下の記事を参照。

select_dtypes()の基本的な使い方

抽出する型を指定: 引数include

引数includeに抽出するデータ型dtypeを指定します。

print(df.select_dtypes(include=int))
#    a
# 0  1
# 1  2
# 2  1
# 3  3

intやfloatのようにPythonの組み込み型として用意されているものはそのまま指定できます。文字列として'int'と指定してもいいし、厳密にビット数まで含めて'int64'としてもいい。(標準のビット数は環境によって異なる)

print(df.select_dtypes(include='int'))
#    a
# 0  1
# 1  2
# 2  1
# 3  3

print(df.select_dtypes(include='int64'))
#    a
# 0  1
# 1  2
# 2  1
# 3  3

当然ながらビット数まで含める場合はビット数まで一致していないと選択されない。

print(df.select_dtypes(include='int32'))
# Empty DataFrame
# Columns: []
# Index: [0, 1, 2, 3]

リストで複数のデータ型dtypeを指定可能。日時datetime64[ns]は'datetime'で指定できます。

print(df.select_dtypes(include=[int, float, 'datetime']))
#    a    b          f
# 0  1  0.4 2018-01-01
# 1  2  1.1 2018-03-15
# 2  1  0.1 2018-02-20
# 3  3  0.8 2018-03-15

intやfloatなどの数値型は特殊な値'number'でまとめて指定可能。

print(df.select_dtypes(include='number'))
#    a    b
# 0  1  0.4
# 1  2  1.1
# 2  1  0.1
# 3  3  0.8

文字列str型を要素とする列のデータ型dtypeはobjectだが、object列にはstr以外のPython標準の組み込み型も含まれる。実際にはあまりないが、もし例のようにlist型を要素とする列があった場合、include=objectではその列も抽出されるので注意。

print(df.select_dtypes(include=object))
#    c       d
# 0  X  [0, 0]
# 1  Y  [0, 1]
# 2  X  [1, 0]
# 3  Z  [1, 1]

print(type(df.at[0, 'c']))
# <class 'str'>

print(type(df.at[0, 'd']))
# <class 'list'>

もっとも、意図的に処理しない限り文字列str型以外のobjectがpandas.DataFrameの要素となることは(多分)ないので、あまり気にする必要はないと思います。

除外する型を指定: 引数exclude

引数excludeに除外するデータ型dtypeを指定します。リストで複数のデータ型dtypeを指定することもできます。

print(df.select_dtypes(exclude='number'))
#    c       d      e          f
# 0  X  [0, 0]   True 2018-01-01
# 1  Y  [0, 1]   True 2018-03-15
# 2  X  [1, 0]  False 2018-02-20
# 3  Z  [1, 1]   True 2018-03-15

print(df.select_dtypes(exclude=[bool, 'datetime']))
#    a    b  c       d
# 0  1  0.4  X  [0, 0]
# 1  2  1.1  Y  [0, 1]
# 2  1  0.1  X  [1, 0]
# 3  3  0.8  Z  [1, 1]

includeとexcludeは同時に指定可能だが、同じ型を指定するとエラー。

print(df.select_dtypes(include='number', exclude=int))
#      b
# 0  0.4
# 1  1.1
# 2  0.1
# 3  0.8

# print(df.select_dtypes(include=[int, bool], exclude=int))
# ValueError: include and exclude overlap on frozenset({<class 'numpy.int64'>})

シェア

関連カテゴリー

Python pandas

pandas.DataFrame, Seriesを辞書に変換(to_dict) Python, pandasでwebページの表(htmlのtable)をスクレイピング pandasでcsv/tsvファイル読み込み(read_csv, read_table) pandasでcsvファイルの書き出し・追記(to_csv) pandasで特定の条件を満たす要素数をカウント(全体、行・列ごと) pandas.DataFrameのforループ処理(イテレーション) pandas.DataFrame, Seriesを順位付けするrank pandasのMultiindexの指定・追加・解除・ソート・レベル変更 pandas.DataFrame, Seriesをpickleで保存、読み込み(to_pickle, read_pickle) pandasのjson_normalizeで辞書のリストをDataFrameに変換 『Python Data Science Handbook』(英語の無料オンライン版あり) pandasで行・列ごとの最頻値を取得するmode pandasで時系列データのOHLC(四本値)を算出・ダウンサンプリング pandasの文字列メソッドで置換や空白削除などの処理を行う pandas.Seriesのインデックスと値を入れ替え(スワップ)

Last Updated: 6/26/2019, 10:34:03 PM