45

Pythonでパンダを使用して、カテゴリ変数から一連のダミー変数を作成しようとしています。関数に出くわしましたが、get_dummies呼び出そうとすると、名前が定義されていないというエラーが表示されます。

ダミー変数を作成するための考えや他の方法をいただければ幸いです。

編集:他の人がこれに遭遇しているように見えるのでget_dummies、パンダの機能は完全にうまく機能するようになりました。これは、以下が機能することを意味します。

import pandas as pd

dummies = pd.get_dummies(df['Category'])

詳細については、 http://blog.yhathq.com/posts/logistic-regression-and-python.htmlを参照してください。

4

11 に答える 11

35

ダミー変数について考えるとき、OLS回帰のコンテキストでそれらを使用することを考え、次のようにします。

import numpy as np
import pandas as pd
import statsmodels.api as sm

my_data = np.array([[5, 'a', 1],
                    [3, 'b', 3],
                    [1, 'b', 2],
                    [3, 'a', 1],
                    [4, 'b', 2],
                    [7, 'c', 1],
                    [7, 'c', 1]])                


df = pd.DataFrame(data=my_data, columns=['y', 'dummy', 'x'])
just_dummies = pd.get_dummies(df['dummy'])

step_1 = pd.concat([df, just_dummies], axis=1)      
step_1.drop(['dummy', 'c'], inplace=True, axis=1)
# to run the regression we want to get rid of the strings 'a', 'b', 'c' (obviously)
# and we want to get rid of one dummy variable to avoid the dummy variable trap
# arbitrarily chose "c", coefficients on "a" an "b" would show effect of "a" and "b"
# relative to "c"
step_1 = step_1.applymap(np.int) 

result = sm.OLS(step_1['y'], sm.add_constant(step_1[['x', 'a', 'b']])).fit()
print result.summary()
于 2014-05-29T03:26:56.530 に答える
23

質問から何を探しているのかを推測するのは難しいですが、私の推測は次のとおりです。

一部の列が「Category」であり、カテゴリの整数(または一意の識別子)を含むDataFrameがあると仮定すると、次のことができます。

DataFrameを呼び出し、各行について、1からNまでの整数のセットの値であるdfrmと想定します。次に、dfrm['Category']

for elem in dfrm['Category'].unique():
    dfrm[str(elem)] = dfrm['Category'] == elem

これで、その行のデータがそのカテゴリに含まれるかどうかに応じて、True/Falseである各カテゴリの新しいインジケータ列が作成されます。

カテゴリ名を制御したい場合は、次のような辞書を作成できます。

cat_names = {1:'Some_Treatment', 2:'Full_Treatment', 3:'Control'}
for elem in dfrm['Category'].unique():
    dfrm[cat_names[elem]] = dfrm['Category'] == elem

カテゴリ値の文字列変換だけでなく、指定された名前の列が作成されます。実際、一部のタイプでstr()は、有用なものが何も生成されない場合があります。

于 2012-07-21T02:29:57.203 に答える
20

公式ドキュメントに基づく:

dummies = pd.get_dummies(df['Category']).rename(columns=lambda x: 'Category_' + str(x))
df = pd.concat([df, dummies], axis=1)
df = df.drop(['Category'], inplace=True, axis=1)

FastMLブログにも素敵な投稿があります。

于 2015-12-24T21:07:15.503 に答える
8

次のコードは、「Category」列がカテゴリ列に置き換えられたデータフレームを返します。

df_with_dummies = pd.get_dummies(df, prefix='Category_', columns=['Category'])

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html

于 2017-02-14T18:17:59.953 に答える
2

私の場合、私の問題dmatricesを解決しました。patsy実際、この関数は、Rスタイルの数式文字列を使用して特定のDataFrameから従属変数と独立変数を生成するために設計されています。ただし、カテゴリフィーチャからダミーフィーチャを生成するために使用できます。dmatrices元のDataFrameに関係なく、自動的に生成される「切片」列を削除するだけです。

import pandas as pd
from patsy import dmatrices

df_original = pd.DataFrame({
   'A': ['red', 'green', 'red', 'green'],
   'B': ['car', 'car', 'truck', 'truck'],
   'C': [10,11,12,13],
   'D': ['alice', 'bob', 'charlie', 'alice']},
   index=[0, 1, 2, 3])

_, df_dummyfied = dmatrices('A ~ A + B + C + D', data=df_original, return_type='dataframe')
df_dummyfied = df_dummyfied.drop('Intercept', axis=1)

df_dummyfied.columns    
Index([u'A[T.red]', u'B[T.truck]', u'D[T.bob]', u'D[T.charlie]', u'C'], dtype='object')

df_dummyfied
   A[T.red]  B[T.truck]  D[T.bob]  D[T.charlie]     C
0       1.0         0.0       0.0           0.0  10.0
1       0.0         0.0       1.0           0.0  11.0
2       1.0         1.0       0.0           1.0  12.0
3       0.0         1.0       0.0           0.0  13.0
于 2016-09-23T18:06:15.163 に答える
2

カテゴリデータを処理するためのダミー変数を作成できます

# Creating dummy variables for categorical datatypes
trainDfDummies = pd.get_dummies(trainDf, columns=['Col1', 'Col2', 'Col3', 'Col4'])

これにより、trainDfの元の列が削除され、 trainDfDummiesデータフレームの最後にダミー変数が列に追加されます。

元の列名の最後に値を追加することにより、列名が自動的に作成されます。

于 2017-05-21T23:28:03.220 に答える
1

NumPyとPandasを使用するカテゴリ変数が非常に少ない場合は、get_dummiesを使用しない非常に単純なアプローチ。

<"State">という名前の列があり、3つのカテゴリ変数<'New York'>、<'California'>、および<'Florida'>があり、それぞれに0と1を割り当てたいとします。

次の簡単なコードでそれを行うことができます。

import numpy as np
import pandas as pd

dataset['NewYork_State'] = np.where(dataset['State']=='New York', 1, 0)
dataset['California_State'] = np.where(dataset['State']=='California', 1, 0)
dataset['Florida_State'] = np.where(dataset['State']=='Florida', 1, 0)
 

上記では、値「NewYork_State」、「California_State」、「Florida_State」を格納するための3つの新しい列を作成します。

Drop the original column

dataset.drop(columns=['State'],axis=1,inplace=True)
于 2021-07-23T06:56:25.367 に答える
0

それで、私は実際に今日(2013年7月25日)この質問に対する答えを必要としていたので、私はこれを以前に書きました。私はいくつかのおもちゃの例でそれをテストしました、うまくいけばあなたはそれからいくらかのマイレージを得るでしょう

def categorize_dict(x, y=0):
    # x Requires string or numerical input
    # y is a boolean that specifices whether to return category names along with the dict.
    # default is no
    cats = list(set(x))
    n = len(cats)
    m = len(x)
    outs = {}
    for i in cats:
        outs[i] = [0]*m
    for i in range(len(x)):
        outs[x[i]][i] = 1
    if y:
        return outs,cats
    return outs
于 2013-07-25T00:12:39.350 に答える
0

このコードを使用して、すべての状態に対してダミー変数を作成しました。

def create_dummy_column(series, f):
    return series.apply(f)

for el in df.area_title.unique():
    col_name = el.split()[0] + "_dummy"
    f = lambda x: int(x==el)
    df[col_name] = create_dummy_column(df.area_title, f)
df.head()

より一般的には、.applyを使用して、カテゴリを定義する不等式を持つ無名関数を渡します。

(.unique()インサイトを提供してくれた@ prpl.mnky.dshwshrに感謝します)

于 2014-12-20T05:51:26.903 に答える
0

カテゴリ機能の処理scikit-learnは、すべての機能が数値であることを想定しています。では、モデルにカテゴリ機能を含めるにはどうすればよいでしょうか。

順序付けられたカテゴリ:適切な数値に変換します(例:small = 1、medium = 2、large = 3)順序付けられていないカテゴリ:ダミーエンコーディングを使用します(0/1)データセットのカテゴリ機能は何ですか?

順序付けられたカテゴリ:天気(実用的な数値ですでにエンコードされています)順序付けられていないカテゴリ:季節(ダミーエンコードが必要)、休日(すでにダミーエンコードされています)、就業日(すでにダミーエンコードされています)季節の場合、エンコードを1=春のままにすることはできません、2 =夏、3 =秋、4 =冬。これは、順序付けられた関係を意味するためです。代わりに、複数のダミー変数を作成します。

# An utility function to create dummy variable
`def create_dummies( df, colname ):
col_dummies = pd.get_dummies(df[colname], prefix=colname)
col_dummies.drop(col_dummies.columns[0], axis=1, inplace=True)
df = pd.concat([df, col_dummies], axis=1)
df.drop( colname, axis = 1, inplace = True )
return df`
于 2018-04-05T07:38:17.503 に答える
0

カテゴリ値の列に基づいてダミーを作成するためのシンプルで堅牢な方法:

for category in list(df['category_column'].unique()):
    df[category] = lis(map(lambda x: 1 if x==category else 0, df['category_column']))

ただし、ダミートラップ変数に陥らないように、カテゴリの1つを除外する必要があるため、OLS回帰を実行するときは注意してください。

于 2021-11-06T12:55:11.880 に答える