我正在尝试使用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)
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博客中也有一篇不错的帖子.
以下代码返回数据框,其中“类别”列由类别列替换:
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