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

2024-06-01 00:20:22 发布

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

我有这样的数据:

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

本质上是对它们进行编码,以标记它们与每个类别的关联。此外,如果我可以重命名列,使它有它的主要列,如“亚洲注册”等。 我试过使用Pivot,Pivot\u table,Stack,Unstack,但是没有成功


Tags: 标记dataphonetvshoppaperusbank
1条回答
网友
1楼 · 发布于 2024-06-01 00:20:22

如果只需要0/1输出,则将^{}^{}max一起使用;如果需要计数值,则使用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

相关问题 更多 >