web-dev-qa-db-ja.com

すべてのカテゴリが存在しない場合のダミー変数

列の1つにカテゴリ変数が含まれるデータフレームのセットがあります。それをいくつかのダミー変数に変換したいのですが、その場合は通常get_dummiesを使用します。

起こることは、get_dummiesが各データフレームで利用可能なデータを見て、カテゴリーがいくつあるかを調べ、適切な数のダミー変数を作成することです。しかし、私が今取り組んでいる問題では、可能なカテゴリーが何であるかを事前に知っています。ただし、各データフレームを個別に見ると、必ずしもすべてのカテゴリが表示されるわけではありません。

私の質問は:get_dummies(または同等の関数)にカテゴリの名前を渡す方法があるので、特定のデータフレームに表示されないカテゴリについては、 0の列?

これを行うもの:

categories = ['a', 'b', 'c']

   cat
1   a
2   b
3   a

これになる:

  cat_a  cat_b  cat_c
1   1      0      0
2   0      1      0
3   1      0      0
37
Berne

転置と再インデックスの使用

import pandas as pd

cats = ['a', 'b', 'c']
df = pd.DataFrame({'cat': ['a', 'b', 'a']})

dummies = pd.get_dummies(df, prefix='', prefix_sep='')
dummies = dummies.T.reindex(cats).T.fillna(0)

print dummies

    a    b    c
0  1.0  0.0  0.0
1  0.0  1.0  0.0
2  1.0  0.0  0.0
24
piRSquared

カテゴリの名前をget_dummies(または同等の関数)に渡す方法があるので、特定のデータフレームに表示されないカテゴリについては、0の列を作成するだけですか?

はいあります! Pandasには カテゴリデータ のためだけの特別なタイプのシリーズがあります。このシリーズの属性の1つは可能なカテゴリで、get_dummies 考慮する。以下に例を示します。

In [1]: import pandas as pd

In [2]: possible_categories = list('abc')

In [3]: cat = pd.Series(list('aba'))

In [4]: cat = cat.astype('category', categories=possible_categories)

In [5]: cat
Out[5]: 
0    a
1    b
2    a
dtype: category
Categories (3, object): [a, b, c]

次に、get_dummiesはまさにあなたが望むことをするでしょう!

In [6]: pd.get_dummies(cat)
Out[6]: 
   a  b  c
0  1  0  0
1  0  1  0
2  1  0  0

カテゴリSeriesまたはDataFrameを作成する方法は他にもたくさんありますが、これは私が最も便利だと思う方法です。それらすべてについて pandas documentation で読むことができます。

編集:

正確なバージョン管理は行っていませんが、少なくともバージョン0.17.0までは、pandasがスパース行列を処理する方法に bug がありました。バージョンによって修正されました。 0.18.1(2016年5月にリリース)。

バージョン0.17.0の場合、sparse=TrueオプションにDataFrameを指定すると、欠落しているダミー変数のゼロの列はNaNの列になり、密に変換されます。

33
T.C. Proctor

これを試して:

In[1]: import pandas as pd
       cats = ["a", "b", "c"]

In[2]: df = pd.DataFrame({"cat": ["a", "b", "a"]})

In[3]: pd.concat((pd.get_dummies(df.cat, columns=cats), pd.DataFrame(columns=cats))).fillna(0)
Out[3]: 
     a    b    c
0  1.0  0.0  0
1  0.0  1.0  0
2  1.0  0.0  0
4
Kapil Sharma

_get_dummies_はすぐにこれを提供するとは思わず、columnの値を強調する追加のNaNを作成することしかできません。

欠落しているcolumnsを自分で追加するには、_pd.concat_を_axis=0_に沿って使用して、DataFrames(ダミー列とDataFrameid)不足している列を自動的に作成し、fillna(0)を使用して不足している値を置き換えてから、.groupby('id')を使用してさまざまなDataFrameを再度分離します。

3
Stefan

これをpandas githubで確認しました。すべての可能なカテゴリを定義するCategoricalとして列を定義すると、実際に簡単に回避できることがわかりました。

_df['col'] = pd.Categorical(df['col'], categories=['a', 'b', 'c', 'd'])
_

get_dummies()は残りを期待どおりに実行します。

3
andre

テストセットに不足しているカテゴリを追加します。

# Get missing columns in the training test
missing_cols = set( train.columns ) - set( test.columns )
# Add a missing column in test set with default value equal to 0
for c in missing_cols:
    test[c] = 0
# Ensure the order of column in the test set is in the same order than in train set
test = test[train.columns]

このコードは、テストデータセットのカテゴリに起因する列を削除しますが、トレーニングデータセットには存在しないことに注意してください。

1

他の人が提案したように-カテゴリ機能を「カテゴリ」データ型に変換すると、「get_dummies」を使用してラベルが表示されない問題を解決できます。

# Your Data frame(df)
from sklearn.model_selection import train_test_split
X = df.loc[:,df.columns !='label']
Y = df.loc[:,df.columns =='label']

# Split the data into 70% training and 30% test
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3) 

# Convert Categorical Columns in your data frame to type 'category'
for col in df.select_dtypes(include=[np.object]).columns:
    X_train[col] = X_train[col].astype('category', categories = df[col].unique())
    X_test[col] = X_test[col].astype('category', categories = df[col].unique())

# Now, use get_dummies on training, test data and we will get same set of columns
X_train = pd.get_dummies(X_train,columns = ["Categorical_Columns"])
X_test = pd.get_dummies(X_test,columns = ["Categorical_Columns"])
1
Rudr