我正在尝试使用python中的pandas从分类变量创建一系列虚拟变量。我遇到了get_dummies
函数,但每当我尝试调用它时,我都会收到一个错误,名称未定义。
任何有关创建虚拟变量的想法或其他方法都将受到赞赏。
编辑:由于其他人似乎遇到了这个问题,所以pandas中的get_dummies
功能现在运行得非常好。这意味着以下内容应该有效:
import pandas as pd
dummies = pd.get_dummies(df['Category'])
有关详细信息,请参阅http://blog.yhathq.com/posts/logistic-regression-and-python.html。
答案 0 :(得分:28)
当我想到虚拟变量时,我想在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()
答案 1 :(得分:16)
很难从问题中推断出你在寻找什么,但我最好的猜测如下。
如果我们假设您有一个DataFrame,其中某些列是“Category”并且包含类别的整数(或其他唯一标识符),那么我们可以执行以下操作。
调用DataFrame dfrm
,并假设对于每一行,dfrm['Category']
是从1到N的整数集中的某个值。然后,
for elem in dfrm['Category'].unique():
dfrm[str(elem)] = dfrm['Category'] == elem
现在每个类别都会有一个新的指标列,它是真/假,具体取决于该行中的数据是否属于该类别。
如果要控制类别名称,可以创建字典,例如
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 :(得分:13)
答案 3 :(得分:5)
以下代码返回数据框,其中“类别”列替换为分类列:
with UniSQL1 do
begin
SQL.Clear;
SQL.Add('Create TABLE tab1(');
SQL.Add( EMP_NO EMPNO NOT NULL,');
SQL.Add(' FIRST_NAME "FIRSTNAME" NOT NULL,');
SQL.Add(' LAST_NAME "LASTNAME" NOT NULL,');
SQL.Add(' PHONE_EXT VARCHAR(4) COLLATE NONE,');
SQL.Add(' PRIMARY KEY (EMP_NO)');
SQL.Add(')');
try
Execute;
except
on E:Exception do
raise Exception.Create('ERROR 1:' + sLineBreak + E.Message);
end;
SQL.Clear;
SQL.Add('CREATE GENERATOR gen_tab1_EMP_NO;');
try
Execute;
except
on E:Exception do
raise Exception.Create('ERROR 2:' + sLineBreak + E.Message);
end;
SQL.Clear;
SQL.Add('SET GENERATOR gen_tab1_EMP_NO TO 0;');
try
Execute;
except
on E:Exception do
raise Exception.Create('ERROR 3:' + sLineBreak + E.Message);
end;
SQL.Clear;
SQL.Add('CREATE TRIGGER SET_EMP_NO FOR tab1 ACTIVE BEFORE INSERT POSITION 0 AS');
SQL.Add('BEGIN');
SQL.Add(' if (new.emp_no is null) then');
SQL.Add(' new.emp_no = gen_id(gen_tab1_EMP_NO, 1);');
SQL.Add('END'
try
Execute;
except
on E:Exception do
raise Exception.Create('ERROR 4:' + sLineBreak + E.Message);
end;
end;
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html
答案 4 :(得分:2)
就我而言,dmatrices
中的patsy
解决了我的问题。实际上,此函数用于从给定的DataFrame生成具有R样式公式字符串的相关变量和独立变量。但它可以用于从分类特征生成虚拟特征。您需要做的就是自动删除dmatrices
生成的“拦截”列,无论您的原始数据框如何。
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
答案 5 :(得分:1)
您可以创建虚拟变量来处理分类数据
# Creating dummy variables for categorical datatypes
trainDfDummies = pd.get_dummies(trainDf, columns=['Col1', 'Col2', 'Col3', 'Col4'])
这将删除 trainDf 中的原始列,并在 trainDfDummies 数据框的末尾附加虚拟变量列。
它会通过在原始列名末尾附加值来自动创建列名。
答案 6 :(得分:1)
一个非常简单的方法不使用 get_dummies 如果您使用 NumPy 和 Pandas 的分类变量非常少。
<块引用>让,我有一个名为 <"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”。
Drop the original column
dataset.drop(columns=['State'],axis=1,inplace=True)
答案 7 :(得分: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
答案 8 :(得分: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并传递一个匿名函数,其中包含定义类别的不等式。
(感谢@ prpl.mnky.dshwshr了解.unique()见解)
答案 9 :(得分: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`