使用 get_dummies 时删除冗余列

新手上路,请多包涵

您好,有一个熊猫数据 df 包含分类变量。

 df=pandas.DataFrame(data=[['male','blue'],['female','brown'],
['male','black']],columns=['gender','eyes'])

df
Out[16]:
   gender   eyes
0    male   blue
1  female  brown
2    male  black

使用函数 get_dummies 我得到以下数据框

df_dummies = pandas.get_dummies(df)

df_dummies
Out[18]:
   gender_female  gender_male  eyes_black  eyes_blue  eyes_brown
0              0            1           0          1           0
1              1            0           0          0           1
2              0            1           1          0           0

Owever 列 gender_femalegender_male 包含相同的信息,因为原始列可以采用二进制值。有没有一种(聪明的)方法可以只保留两列中的一列?

更新

指某东西的用途

df_dummies = pandas.get_dummies(df,drop_first=True)

会给我

df_dummies
Out[21]:
   gender_male  eyes_blue  eyes_brown
0            1          1           0
1            0          0           1
2            1          0           0

但我想删除最初我只有两种可能性的列

期望的结果应该是

df_dummies
Out[18]:
   gender_male  eyes_black  eyes_blue  eyes_brown
0  1           0          1           0
1  0           0          0           1
2  1           1          0           0

原文由 gabboshow 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 746
2 个回答

是的,您可以使用参数 dropfirst

 drop_first=True

文档 中:

 pd.get_dummies(pd.Series(list('abcaa')), drop_first=True)
   b  c
0  0  0
1  1  0
2  0  1
3  0  0
4  0  0

要拥有 --- 的所有虚拟列,以及 gender eyes 的虚拟列,请使用:

 df = pd.get_dummies(df, prefix=['eyes'], columns=['eyes'])
df = pd.get_dummies(df,drop_first=True)

输出:

        eyes_black  eyes_blue  eyes_brown  gender_male
0           0          1           0            1
1           0          0           1            0
2           1          0           0            1

更一般:

    gender   eyes    heigh
0    male   blue     tall
1  female  brown    short
2    male  black  average

for i in df.columns:
    if len(df.groupby([i]).size()) > 2:
         df = pd.get_dummies(df, prefix=[i], columns=[i])
df = pd.get_dummies(df, drop_first=True)

输出:

    eyes_black  eyes_blue  eyes_brown  heigh_average  heigh_short  heigh_tall  \
0           0          1           0              0            0           1
1           0          0           1              0            1           0
2           1          0           0              1            0           0

   gender_male
0            1
1            0
2            1

原文由 Joe 发布,翻译遵循 CC BY-SA 4.0 许可协议

或者,您可以将数据帧拆分为要应用的部分 drop_first=True 和不应用的部分。然后将它们连接在一起。

 df1 = df.iloc[:, 0:2]
df2 = df.iloc[:, 2:]
df1 = pd.get_dummies(df1 ,drop_first=True)

df = pd.concat([df1, df2], axis=1)

原文由 David LE 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题