【Googleフォームなど!】複数回答のカテゴリ変数をエンコーディングする方法

Python

Pandasを利用した複数回答カテゴリーエンコーディングにハマったのでここに解決方法をメモ書きしておきます。
Googleフォームなどの複数回答項目はアンケートとしてもメジャーですし、回帰分析などの予測分析でも使えるものなので結構役立つと思います。

Pandasのget_dummies()があるから複数回答のエンコーディングもあるもんだと思ったのですが見つからなかったため自作しました。Pandasを使い慣れていないので土臭いコードとなっていますが、より良い書き方があったら教えてください。

ad

サンプル

こちらが複数回答をエンコーディングする処理です。

複数回答エンコード処理

関数にまとめてみました。

import numpy as np
import pandas as pd

def get_multiple_dummies(df, clm):
    df=df.copy()
    # 内容をよろしく置換しつつ、複数回答を配列に分解
    ansies=df[clm].str.replace(' \n','').str.replace(' ','').fillna('').str.split('、')
    # レコードごとに処理
    ansies_=[]
    for ans in ansies:
            # 複数回答ごとに処理
            ans_=[]
            for a in ans:
                    # カラム名のプレフィックスを追加
                    a=clm+'_'+a
                    ans_.append(a)
            # 複数回答を追加
            ansies_.append(ans_)
    # レコードの追加
    ansies=pd.Series(ansies_)
    #複数回答のdummyエンコード
    ansies=ansies.apply(lambda x: pd.Series(1, index=x)).fillna(0).astype(int)

    # 結果データに追加して元カラムを削除
    df=pd.concat([df, ansies], axis=1)
    df=df.drop(clm,axis=1)

    return df

テストデータ

こちらがテストデータです。
Googleフォームの区切り文字が全角"、"なためそれに合わせています。

df=pd.DataFrame(
    [('進撃の巨人'),('鬼滅の刃'),('ガンダム'),('進撃の巨人、鬼滅の刃、エバ')]
    ,columns=['好きなアニメ']
)
df

データのイメージ

好きなアニメ
進撃の巨人
鬼滅の刃
ガンダム
進撃の巨人、鬼滅の刃、エバ

呼び出し例

このように実行します。
get_dummies()の関数に倣って引数で複数項目を指定しています。

get_multiple_dummies(df,'好きなアニメ')

結果

好きなアニメ_進撃の巨人 好きなアニメ_鬼滅の刃 好きなアニメ_ガンダム 好きなアニメ_エバ
1 0 0 0
0 1 0 0
0 0 1 0
1 1 0 1

このように「元の項目名」_「選択項目」のカラムが作成されて、値に0か1が設定されます。

コメント