根据Python中的唯一键将列中的类别转换为编码为1或0的多列

时间:2018-12-19 09:25:54

标签: python pandas numpy pivot pandas-groupby

我有这样的数据:

user    reg       ind       prod   
 A       Asia     Tele       TV
 A       Asia     Bank       Phone
 A       Japan    Tele       Book
 B       US       Fin        Paper
 B       US       Data       Shop
 B       Asia     Tele       TV
 B       Africa   Invest     Book
 C       Asia     Tele       Paper
 C       Japan    Fin        TV

我想将每个列中的类别转换为单独的列,如果它们位于用户下方,则将它们标记为1/0,如下所示:

User Asia Japan US Africa Tele Bank Fin Data Invest TV Phone Book Paper Shop 
 A     1    1   0   0      1    1    0   0    0      1   1     1    0     0
 B     1    0   1   1      1    0    1   1    1      1   0     1    1     1
 C     1    1   0   0      1    0    1   0    0      1   0     0    1     0

本质上编码它们以标记它们与每个类别的关联。另外,如果我可以重命名列,使其具有主列,例如“ reg_Asia”等。 我尝试使用Pivot,Pivot_table,Stack,Unstack,但无法做到这一点。

1 个答案:

答案 0 :(得分:4)

如果仅希望输出max,请对get_dummies0/1使用set_index;如果希望计数值,请使用sum

df = pd.get_dummies(df.set_index('user'), prefix='', prefix_sep='').max(level=0).reset_index()
print (df)
  user  Africa  Asia  Japan  US  Bank  Data  Fin  Invest  Tele  Book  Paper  \
0    A       0     1      1   0     1     0    0       0     1     1      0   
1    B       1     1      0   1     0     1    1       1     1     1      1   
2    C       0     1      1   0     0     0    1       0     1     0      1   

   Phone  Shop  TV  
0      1     0   1  
1      0     1   1  
2      0     0   1  

如果还希望对数据进行分类,请创建MultiIndex

df1= pd.get_dummies(df.set_index('user')).max(level=0)
df1.columns = df1.columns.str.split('_', expand=True)
print (df1)
        reg                ind                      prod                    
     Africa Asia Japan US Bank Data Fin Invest Tele Book Paper Phone Shop TV
user                                                                        
A         0    1     1  0    1    0   0      0    1    1     0     1    0  1
B         1    1     0  1    0    1   1      1    1    1     1     0    1  1
C         0    1     1  0    0    0   1      0    1    0     1     0    0  1

print (df1['reg'])
      Africa  Asia  Japan  US
user                         
A          0     1      1   0
B          1     1      0   1
C          0     1      1   0