K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

パターンマッチで列を選択

01.5.3

パターンマッチで列を選択

最終更新 2020-02-26 読了時間 2 分
まとめ
列数が多い表で「名前に 暦 を含む列だけ標準化したい」のように列を名前の規則で選ぶとき、列名を 1 つずつ書き並べる代わりに make_column_selector(pattern="暦") を使います。pattern は正規表現で列名に照合され、sample.csv では 和暦 と 西暦 の 2 列だけが選ばれて StandardScaler の対象になります。選ばれなかった 元号・人口総数・町名 は make_column_transformer の既定 remainder="drop" によって出力から落ちるので、変換後の表は 2 列になります。読み終えると、列が増えたり並び順が変わったりしても壊れない前処理の指定が書けるようになります。

直感 #

アンケートの表に Q1_満足度, Q2_満足度, … と同じ接尾辞の列が 30 本あるとき、["Q1_満足度", "Q2_満足度", …] と手で列挙すると、列が 1 本増えただけで指定が漏れます。make_column_selector は「名前がこの正規表現に一致する列」という規則で列を選ぶので、fit_transform を呼んだ時点の列名を見て毎回選び直してくれます。このページでは pattern="暦" という最小の例で、5 列の表から 和暦 と 西暦 の 2 列だけが選ばれる様子を確かめます。

サンプルデータ #

町ごとの人口を年ごとに記録した sample.csv を読み込みます。元号 と 町名 が文字列、和暦・西暦・人口総数 が数値で、列名はすべて日本語です。

1
2
3
4
import pandas as pd

X = pd.read_csv("../data/sample.csv")
X.head()

元号和暦西暦人口総数町名
0大正9.01920.0394748A町
1大正9.01920.031421B町
2大正9.01920.0226993C町
3大正9.01920.0253689D町
4大正9.01920.0288602E町

sklearn.compose.make_column_selector #

sklearn.compose.make_column_selector を使用します。次のコードは pattern="暦" で列名に「暦」を含む列を選び、その列だけに StandardScaler を掛けて平均 0・分散 1 に揃えます。出力は選ばれた 2 列だけの配列になります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from sklearn.preprocessing import StandardScaler
from sklearn.compose import make_column_transformer
from sklearn.compose import make_column_selector

n_ss = StandardScaler()

# 暦が含まれる列のみスケーリング
ct = make_column_transformer(
    (n_ss, make_column_selector(pattern="暦")), sparse_threshold=0
)
X_transform = ct.fit_transform(X)

# 変換後のテーブル
pd.DataFrame(X_transform).head()

01
0-0.946623-1.665466
1-0.946623-1.665466
2-0.946623-1.665466
3-0.946623-1.665466
4-0.946623-1.665466

実行結果の読み方 #

変換後の表が 2 列だけなのは、pattern="暦" に一致した 和暦 と 西暦 だけが出力され、他の 3 列が remainder="drop" で捨てられたからです。先頭 5 行は同じ 1920 年のデータなので値も同じで、和暦 の -0.946623 は「9 年が全体の平均より約 0.95 標準偏差だけ小さい」と読みます。西暦 の -1.665466 の方が絶対値が大きいのは、1920 年がデータの最初の年で、西暦の分布の端にあるためです。

使いどころと落とし穴 #

pattern は部分一致なので、"暦" は 旧暦 や 暦年 にも一致します。狙った列だけに絞りたいときは "^(和暦|西暦)$" のように全体一致で書くか、dtype_include を組み合わせます。make_column_selector はコールバックとして保存され、fit のたびに列名を見直すので、学習時になかった列がテスト時に増えると変換後の列数が変わり、下流のモデルで ValueError になります。学習時と推論時で列の集合が同じことを ct.transformers_ で確認する習慣をつけてください。