58

列の 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
4

10 に答える 10

53

TL;DR :

pd.get_dummies(cat.astype(pd.CategoricalDtype(categories=categories)))
  • 古いパンダ:pd.get_dummies(cat.astype('category', categories=categories))

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

はいあります!Pandas には、カテゴリ データ専用の特別なタイプの Series があります。このシリーズの属性の 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(pd.CategoricalDtype(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、これは私が最も便利だと思う方法です。それらのすべてについては、パンダのドキュメントで読むことができます。

編集:

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

sparse=Trueバージョン 0.17.0 の場合、 a オプションを使用してこれを実行しようとすると、DataFrameダミー変数が欠落している 0 の列が の列になり、NaN密に変換されます。

pandas 0.21.0 が追加されたCategoricalDTypeようで、元の回答のようにカテゴリを明示的に含むカテゴリを作成することは廃止されました。いつになるかはわかりません。

于 2016-05-26T04:53:38.597 に答える
36

転置と再索引付けの使用

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
于 2016-05-25T02:49:08.253 に答える
4

これを試して:

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
于 2016-05-25T01:01:59.513 に答える
4

pandas githubでこれを尋ねました。Categorical考えられるすべてのカテゴリを定義する場所として列を定義すると、非常に簡単に回避できることがわかります。

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

get_dummies()残りは期待どおりに行います。

于 2018-07-27T13:33:50.183 に答える
2

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

# 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]

このコードは、テスト データセットのカテゴリに起因する列も削除しますが、トレーニング データセットには存在しません。

于 2017-07-28T05:07:56.500 に答える