Подтвердить что ты не робот

Создание фиктивных переменных в pandas для python

Я пытаюсь создать серию фиктивных переменных из категориальной переменной, используя pandas в python. Я столкнулся с функцией get_dummies, но всякий раз, когда я пытаюсь ее вызвать, я получаю сообщение об ошибке, что имя не определено.

Любые мысли или другие способы создания фиктивных переменных будут оценены.

РЕДАКТИРОВАТЬ: поскольку другие, похоже, сталкиваются с этим, функция get_dummies в pandas теперь работает отлично. Это означает, что следующее должно работать:

import pandas as pd

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

Подробнее см. http://blog.yhathq.com/posts/logistic-regression-and-python.html.

4b9b3361

Ответ 1

Трудно сделать вывод о том, что вы ищете, но мое лучшее предположение заключается в следующем.

Если мы предположим, что у вас есть DataFrame, где какой-то столбец является "Категория" и содержит целые числа (или иначе уникальные идентификаторы) для категорий, мы можем сделать следующее.

Вызвать DataFrame dfrm и предположить, что для каждой строки dfrm['Category'] - некоторое значение в наборе целых чисел от 1 до N. Затем

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() может не создать ничего полезного для вас.

Ответ 2

Когда я думаю о фиктивных переменных, я думаю об использовании их в контексте регрессии 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()

Ответ 3

На основе официальной документации :

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 есть также post.

Ответ 5

Вы можете создавать фиктивные переменные для обработки категориальных данных

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

Это приведет к удалению исходных столбцов в trainDf и добавит столбец с фиктивными переменными в конце trainDfDummies.

Он автоматически создает имена столбцов, добавляя значения в конце исходного имени столбца.

Ответ 6

Поэтому мне действительно нужно было ответить на этот вопрос сегодня (7/25/2013), поэтому я написал это ранее. Я тестировал его с некоторыми примерами игрушек, надеюсь, вы получите пробег из него.

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

Ответ 7

Я создал фиктивную переменную для каждого состояния, используя этот код.

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 и передал ему анонимную функцию с неравенством, которое определяет вашу категорию.

(Спасибо @prpl.mnky.dshwshr за понимание .unique())

Ответ 8

В моем случае dmatrices в patsy решила мою проблему. Фактически, эта функция предназначена для генерации зависимых и независимых переменных из заданного DataFrame со строкой формулы R-стиля. Но он может использоваться для создания фиктивных функций из категориальных функций. Все, что вам нужно сделать, это удалить столбец "Перехват", который генерируется 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