在pandas中为python创建虚拟变量

use*_*057 32 python pandas

我正在尝试使用python中的pandas从分类变量创建一系列虚拟变量.我遇到过这个get_dummies函数,但每当我尝试调用它时,我都会收到一个名称未定义的错误.

任何想法或其他方式来创建虚拟变量将不胜感激.

编辑:由于其他人似乎正在遇到这个,get_dummies大熊猫的功能现在完全正常.这意味着以下应该有效:

import pandas as pd

dummies = pd.get_dummies(df['Category'])
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅http://blog.yhathq.com/posts/logistic-regression-and-python.html.

Aka*_*all 29

当我想到虚拟变量时,我想在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()
Run Code Online (Sandbox Code Playgroud)

  • 更新:pandas版本0.18.0,`get_dummies`现在有一个`drop_first`参数,如果设置为'True`将丢弃第一个虚拟变量.例如:`pd.get_dummies(df ['dummy'],drop_first = True)` (7认同)
  • 考虑虚拟陷阱!很好.删除一个虚拟变量列很容易,但你认为get_dummies会选择这个. (2认同)

ely*_*ely 18

很难从问题中推断出你在寻找什么,但我最好的猜测如下.

如果我们假设您有一个DataFrame,其中某些列是"Category"并且包含类别的整数(或其他唯一标识符),那么我们可以执行以下操作.

调用DataFrame dfrm,并假设对于每一行,dfrm['Category']是从1到N的整数集中的某个值.然后,

for elem in dfrm['Category'].unique():
    dfrm[str(elem)] = dfrm['Category'] == elem
Run Code Online (Sandbox Code Playgroud)

现在,每个类别都会有一个新的指标列,它是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
Run Code Online (Sandbox Code Playgroud)

导致具有指定名称的列,而不仅仅是类别值的字符串转换.事实上,对于某些类型,str()可能不会产生任何对您有用的东西.


bey*_*int 14

根据官方文件:

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)
Run Code Online (Sandbox Code Playgroud)

FastML博客中也有一篇不错的帖子.

  • 由于您在最后一行中使用inplace = True,因此返回none并以数据帧结束.我将更新最后一行:df = df.drop(['Category'],axis = 1) (4认同)

Spa*_*pas 7

以下代码返回数据框,其中“类别”列由类别列替换:

df_with_dummies = pd.get_dummies(df, prefix='Category_', columns=['Category'])
Run Code Online (Sandbox Code Playgroud)

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