以下是数据框的详细信息:
我的电脑有以下规格:
以下是我编写代码的方法:
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
是所有被视为绝对的功能。如果您想了解更多信息,请与我们联系。这似乎很奇怪,我的电脑无法运行它。
答案 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_sep
和max
以及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)