私はいくつかの線形回帰分析を実行しようとしています。非常に素晴らしい get_dummies を使用してダミー変数に変換するいくつかのカテゴリ機能があります。
私が直面している問題は、カテゴリのすべての要素を追加するとデータフレームが大きくなりすぎることです。
すべての用語ではなく、最も頻繁に使用される用語のダミー変数を作成する方法 (get_dummies またはより精巧な方法を使用) はありますか?
を使用value_counts()
して頻度のカウントを行い、残しておきたい行のマスクを作成します。
import pandas as pd
values = pd.Series(["a","b","a","b","c","d","e","a"])
counts = pd.value_counts(values)
mask = values.isin(counts[counts > 1].index)
print pd.get_dummies(values[mask])
出力:
a b
0 1 0
1 0 1
2 1 0
3 0 1
7 1 0
すべてのデータが必要な場合:
values[~mask] = "-"
print pd.get_dummies(values)
出力:
- a b
0 0 1 0
1 0 0 1
2 0 1 0
3 0 0 1
4 1 0 0
5 1 0 0
6 1 0 0
7 0 1 0
最初に使用value_counts
して、最も頻繁なものを確認できます。
In [11]: s = pd.Series(list('aabccc'))
In [12]: s
Out[12]:
0 a
1 a
2 b
3 c
4 c
5 c
dtype: object
In [13]: s.value_counts()
Out[13]:
c 3
a 2
b 1
dtype: int64
最も頻度の低い値 (例: 最初の 2 つを除くすべて):
In [14]: s.value_counts().index[2:]
Out[14]: Index([u'b'], dtype=object)
これらすべての出現箇所を単純に NaN に置き換えることができます。
In [15]: s1 = s.replace(s.value_counts().index[2:], np.nan)
In [16]: s1
Out[16]:
0 a
1 a
2 NaN
3 c
4 c
5 c
dtype: object
そして実行しますget_dummies
(これはNaNを無視するべきだと思いますが、バグがあるため、notnull
ハックがあります):
In [16]: pd.get_dummies(s1[s1.notnull()])
Out[16]:
a c
0 1 0
1 1 0
3 0 1
4 0 1
5 0 1
これらの結果を含めたい場合は、別のプレースホルダー (例: '_'
) を使用できます。