使用get_dummies时删除冗余列

2024-05-15 13:08:20 发布

您现在位置:Python中文网/ 问答频道 /正文

Hi有一个包含分类变量的pandas数据帧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

但是列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

Tags: 数据pandasdfget分类bluehiout
2条回答

是的,您可以使用参数dropfirst

drop_first=True

documentation

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

要为eyesgender使用所有伪列,请使用以下命令:

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

您可以使用itertools.combinations来查找所有列对,那么任何潜在的冗余列对都将是一对,其中每一行的一列为True,另一列为False,即异或:

import pandas as pd
from itertools import combinations

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

dummies = pd.get_dummies(df)

for c1, c2 in combinations(dummies.columns, 2):
    if all(dummies[c1] ^ dummies[c2]):
        print(c1,c2)

然而,这也注意到在你的例子中,所有的女性都有棕色的眼睛,因此我们得到了以下的印刷品:

gender_female gender_male
gender_male eyes_brown

相关问题 更多 >