我正在尝试使用python中的pandas从分类变量创建一系列虚拟变量。我遇到过get_dummies
函数,但每当我尝试调用它时,我都会收到一个错误,指出该函数的名称尚未定义。
任何创建虚拟变量的想法或其他方式都将受到欢迎。
编辑:由于其他人似乎也遇到了这个问题,get_dummies
函数现在可以很好地工作。这意味着以下内容应该可以工作:
import pandas as pd
dummies = pd.get_dummies(df['Category'])
有关详细信息,请参阅http://blog.yhathq.com/posts/logistic-regression-and-python.html。
发布于 2012-07-21 10:29:57
很难从问题中推断出你想要的是什么,但我最好的猜测如下。
如果我们假设您有一个DataFrame,其中某个列是“Category”,并且包含类别的整数(或其他唯一标识符),那么我们可以执行以下操作。
调用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()
可能不会产生任何对您有用的东西。
发布于 2014-05-29 11:26:57
当我想到虚拟变量时,我会想到在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()
发布于 2015-12-25 05:07:16
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。
https://stackoverflow.com/questions/11587782
复制相似问题