列の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
転置と再インデックスの使用
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
カテゴリの名前を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
の列になり、密に変換されます。
これを試して:
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
_get_dummies
_はすぐにこれを提供するとは思わず、column
の値を強調する追加のNaN
を作成することしかできません。
欠落しているcolumns
を自分で追加するには、_pd.concat
_を_axis=0
_に沿って使用して、DataFrames
(ダミー列とDataFrame
id
)不足している列を自動的に作成し、fillna(0)
を使用して不足している値を置き換えてから、.groupby('id')
を使用してさまざまなDataFrame
を再度分離します。
これをpandas githubで確認しました。すべての可能なカテゴリを定義するCategorical
として列を定義すると、実際に簡単に回避できることがわかりました。
_df['col'] = pd.Categorical(df['col'], categories=['a', 'b', 'c', 'd'])
_
get_dummies()
は残りを期待どおりに実行します。
テストセットに不足しているカテゴリを追加します。
# 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]
このコードは、テストデータセットのカテゴリに起因する列を削除しますが、トレーニングデータセットには存在しないことに注意してください。
他の人が提案したように-カテゴリ機能を「カテゴリ」データ型に変換すると、「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"])