我的内核是否应该在对这个DataFrame进行热编码时继续死亡

时间:2017-10-10 04:21:36

标签: python pandas one-hot-encoding

以下是数据框的详细信息:

  • Shape =(4584,562)
  • 分类变量数量= 58

我的电脑有以下规格:

  • 16GB的RAM
  • 2.6 GHz Intel Core i7

以下是我编写代码的方法:

df_encoded = df

for idx, var in enumerate(cat_vars):
    temp = pd.get_dummies(df_encoded.iloc[:,idx], prefix = cat_vars[idx])

    temp = df_encoded.drop(cat_vars[0], axis=1)
    df_encoded = pd.concat([df_encoded, temp], axis=1)

df_encoded.head()

cat_vars是所有被视为绝对的功能。如果您想了解更多信息,请与我们联系。这似乎很奇怪,我的电脑无法运行它。

2 个答案:

答案 0 :(得分:1)

我认为循环不是必需的:

df = pd.DataFrame({'A':list('absdektg'),
                   'B':list('scfvbngf'),
                   'C':list('dsxcdscv'),
                   'D':list('fscvdcvf'),
                   'E':list('dswxaxcc')})

print (df)
   A  B  C  D  E
0  a  s  d  f  d
1  b  c  s  s  s
2  s  f  x  c  w
3  d  v  c  v  x
4  e  b  d  d  a
5  k  n  s  c  x
6  t  g  c  v  c
7  g  f  v  f  c

cat_vars = list('ABCD')
df_encoded = pd.get_dummies(df[cat_vars])
df_encoded = pd.concat([df, df_encoded], axis=1)
print (df_encoded)
   A  B  C  D  E  A_a  A_b  A_d  A_e  A_g ...   C_c  C_d  C_s  C_v  C_x  D_c  \
0  a  s  d  f  d    1    0    0    0    0 ...     0    1    0    0    0    0   
1  b  c  s  s  s    0    1    0    0    0 ...     0    0    1    0    0    0   
2  s  f  x  c  w    0    0    0    0    0 ...     0    0    0    0    1    1   
3  d  v  c  v  x    0    0    1    0    0 ...     1    0    0    0    0    0   
4  e  b  d  d  a    0    0    0    1    0 ...     0    1    0    0    0    0   
5  k  n  s  c  x    0    0    0    0    0 ...     0    0    1    0    0    1   
6  t  g  c  v  c    0    0    0    0    0 ...     1    0    0    0    0    0   
7  g  f  v  f  c    0    0    0    0    1 ...     0    0    0    1    0    0   

   D_d  D_f  D_s  D_v  
0    0    1    0    0  
1    0    0    1    0  
2    0    0    0    0  
3    0    0    0    1  
4    1    0    0    0  
5    0    0    0    0  
6    0    0    0    1  
7    0    1    0    0  

[8 rows x 30 columns]

如果需要唯一列名称,请按合并prefix的列添加参数prefix_sepmax以及groupby:

df_encoded1 = (pd.get_dummies(df[cat_vars], prefix='', prefix_sep='')
                .groupby(level=0, axis=1).max())
df_encoded1 = pd.concat([df, df_encoded1], axis=1)
print (df_encoded1)
   A  B  C  D  E  a  b  c  d  e  f  g  k  n  s  t  v  x
0  a  s  d  f  d  1  0  0  1  0  1  0  0  0  1  0  0  0
1  b  c  s  s  s  0  1  1  0  0  0  0  0  0  1  0  0  0
2  s  f  x  c  w  0  0  1  0  0  1  0  0  0  1  0  0  1
3  d  v  c  v  x  0  0  1  1  0  0  0  0  0  0  0  1  0
4  e  b  d  d  a  0  1  0  1  1  0  0  0  0  0  0  0  0
5  k  n  s  c  x  0  0  1  0  0  0  0  1  1  1  0  0  0
6  t  g  c  v  c  0  0  1  0  0  0  1  0  0  0  1  1  0
7  g  f  v  f  c  0  0  0  0  0  1  1  0  0  0  0  1  0

答案 1 :(得分:0)

正如@jezrael所说,不需要for循环。

以下是适合我的解决方案:

df_encoded = df
df_encoded = pd.get_dummies(df_encoded, columns=cat_vars, sparse=True)