test = {'ngrp' : ['Manhattan', 'Brooklyn', 'Queens', 'Staten Island', 'Bronx']}
test = pd.DataFrame(test)
dummy = pd.get_dummies(test['ngrp'], drop_first = True)


这给了我:

   Brooklyn  Manhattan  Queens  Staten Island
0         0          1       0              0
1         1          0       0              0
2         0          0       1              0
3         0          0       0              1
4         0          0       0              0


我将获得Bronx作为我的参考水平(因为那是被删除的东西),如何更改它以指定应该将曼哈顿作为我的参考水平?我的预期输出是

   Brooklyn  Queens  Staten Island  Bronx
0         0       0              0      0
1         1       0              0      0
2         0       1              0      0
3         0       0              1      0
4         0       0              0      1

最佳答案

get_dummies(按字典顺序)对值进行排序,然后创建虚拟变量。这就是为什么您在初始结果中看不到“布朗克斯”的原因;这是因为它是您列中的第一个排序值,因此它被首先删除。

为避免出现您看到的行为,请强制执行顺序为“先看”(即,将其转换为有序类别)。

pd.get_dummies(
    pd.Categorical(test['ngrp'], categories=test['ngrp'].unique(), ordered=True),
    drop_first=True)

   Brooklyn  Queens  Staten Island  Bronx
0         0       0              0      0
1         1       0              0      0
2         0       1              0      0
3         0       0              1      0
4         0       0              0      1


当然,这样做的副作用是返回带有分类列名的虚拟变量,但这几乎不是问题。

09-11 08:28