web-dev-qa-db-ja.com

共線性を回避するためにN-1変数を発行するためにpandas get_dummiesを取得する方法は?

pandas.get_dummiesは、カテゴリー値ごとにダミー変数を発行します。 N-1個のダミー変数のみを作成するように依頼する自動化された簡単な方法はありますか? (1つの「ベースライン」変数を任意に削除するだけです)?

データセットの共直線性を回避するために必要です。

19
ihadanny

Pandasバージョン0.18.0は、まさにあなたが探しているものを実装しました:drop_firstオプション。次に例を示します。

In [1]: import pandas as pd

In [2]: pd.__version__
Out[2]: u'0.18.1'

In [3]: s = pd.Series(list('abcbacb'))

In [4]: pd.get_dummies(s, drop_first=True)
Out[4]: 
     b    c
0  0.0  0.0
1  1.0  0.0
2  0.0  1.0
3  1.0  0.0
4  0.0  0.0
5  0.0  1.0
6  1.0  0.0
27
T.C. Proctor

これを行うにはいくつかの方法があります。

おそらく最も簡単なのは、_get_dummies_を呼び出す前に値の1つをNoneに置き換えることです。あなたが持っていると言う:

_import pandas as pd
import numpy as np
s = pd.Series(list('babca'))
>> s
0    b
1    a
2    b
3    c
4    a
_

次に、以下を使用します。

_>> pd.get_dummies(np.where(s == s.unique()[0], None, s))
    a   c
0   0   0
1   1   0
2   0   0
3   0   1
4   1   0
_

bを削除します。

(もちろん、カテゴリ列にNoneがまだ含まれていないかどうかを考慮する必要があります。)


もう1つの方法は、prefix引数を_get_dummies_に使用することです。

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False)

prefix:文字列、文字列のリスト、または文字列のdict、デフォルトなし-DataFrame列名を追加する文字列DataFrameでget_dummiesを呼び出すときに、列数に等しい長さのリストを渡します。あるいは、プレフィックスは、列名をプレフィックスにマッピングする辞書にすることができます。

これにより、結果のすべての列にプレフィックスが追加され、このプレフィックスが付いた列の1つを消去できます(一意にするだけです)。

3
Ami Tavory