Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在pandas for python中创建虚拟变量_Python_Pandas - Fatal编程技术网

在pandas for python中创建虚拟变量

在pandas for python中创建虚拟变量,python,pandas,Python,Pandas,我试图在python中使用pandas从一个分类变量创建一系列伪变量。我遇到了get\u dummies函数,但每当我尝试调用它时,都会收到一个错误,即名称未定义 任何创建虚拟变量的想法或其他方法都将受到欢迎 编辑:由于其他人似乎遇到了这种情况,熊猫中的get_dummies功能现在运行良好。这意味着以下各项应起作用: import pandas as pd dummies = pd.get_dummies(df['Category']) 有关更多信息,请参阅。很难从这个问题中推断出您在寻找

我试图在python中使用pandas从一个分类变量创建一系列伪变量。我遇到了
get\u dummies
函数,但每当我尝试调用它时,都会收到一个错误,即名称未定义

任何创建虚拟变量的想法或其他方法都将受到欢迎

编辑:由于其他人似乎遇到了这种情况,熊猫中的
get_dummies
功能现在运行良好。这意味着以下各项应起作用:

import pandas as pd

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

有关更多信息,请参阅。

很难从这个问题中推断出您在寻找什么,但我的最佳猜测如下

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

调用数据帧
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()
可能不会产生任何对您有用的结果。

所以我今天(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

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

我使用此代码为每个状态创建了一个虚拟变量

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()洞察)

基于:


FastML博客中还有一个不错的例子。

对于我的情况,
patsy中的
dmatrices
解决了我的问题。实际上,此函数用于从具有R样式公式字符串的给定数据帧生成因变量和自变量。但它可以用于从分类特征生成虚拟特征。您只需删除由
dmatrices
自动生成的列“Intercept”,而不考虑原始数据帧

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

以下代码返回dataframe,其中“Category”列替换为Category列:

df_with_dummies = pd.get_dummies(df, prefix='Category_', columns=['Category'])

您可以创建虚拟变量来处理分类数据

# Creating dummy variables for categorical datatypes
trainDfDummies = pd.get_dummies(trainDf, columns=['Col1', 'Col2', 'Col3', 'Col4'])
这将删除trainDf中的原始列,并在trainDfDummies数据帧的末尾附加虚拟变量


它通过在原始列名末尾追加值来自动创建列名。

处理分类功能 scikit learn希望所有功能都是数字。那么,我们如何在模型中包含一个分类特征呢

有序类别:将它们转换为合理的数值(例如:小=1,中=2,大=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`

我编辑了原始问题以反映熊猫的最新版本。
get_dummies
功能现在运行良好。请考虑虚拟陷阱!很好。删除一个虚拟变量列是很容易的,但是你可能会认为get_dummies会将此作为一个选项。我认为这应该是最好的答案。它只缺少一件事
将statsmodels.api导入为sm
。。这样任何人都可以在她/他的Ipython上试穿notebook@stackunderflow,修正了。谢谢。更新:熊猫版本0.18.0,
get_dummies
现在有一个
drop_first
参数,如果设置为
True
将删除第一个虚拟变量。例如:
pd.get\u dummies(df['dummy'],drop\u first=True)
get\u dummies有一个drop\u first选项。现在有没有更好的方法来进行一次热编码,指定返回的伪变量列的名称?因为在最后一行中执行了inplace=True,所以返回none,并以空数据帧结束。我将更新最后一行:df=df.drop(['Category'],axis=1)
# 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`