首页 > 解决方案 > 如何在python中以基于行的方式对列表值进行一个热编码?

问题描述

为了解释我想要做什么,我展示了这个例子。

一开始我的数据是这样的。

数据1)

A 列:0、1、2(共 3 个类)

B 列:0、1、2(共 3 个类)

A B
1 1
0 0
2 1 

然后我对 A 列和 B 列进行了一次热编码。在一次热编码之后,我的数据看起来像这样。

数据2)

Index col1 col2 col3 col4 col5 col6  
  0    0    1    0    0    1    0
  1    1    0    0    1    0    0
  2    0    0    1    1    0    0

假设我有很多数据,比如data2。然后,我想对数据帧 data2 进行一次热编码。在这种情况下,索引 0、1、2 的值在 data2 中彼此不同。因此,如果我对 data2 进行一次热编码,那么我的结果应该是

数据3)

Index col1 col2 col3  
  0    1    0    0  
  1    0    1    0 
  2    0    0    1  

像这样。

我怎样才能在python中做到这一点?换句话说,我想对数据帧中的每个元素进行一次热编码

标签: pythonone-hot-encoding

解决方案


根据您想要编码各种可能的行序列的预感,您可以执行以下操作:

import pandas as pd
df=pd.DataFrame({'A':[1,0,2],'B':[1,0,1]})
In [40]: df
Out[40]:
   A  B
0  1  1
1  0  0
2  2  1    

A_oh = pd.get_dummies(df.A,prefix='A')
B_oh = pd.get_dummies(df.B,prefix='B')
df_oh = pd.concat([A_oh,B_oh],axis=1)
In [41]: df_oh
Out[41]:
   A_0  A_1  A_2  B_0  B_1
0    0    1    0    0    1
1    1    0    0    1    0
2    0    0    1    0    1

df_concat = df_oh.apply(lambda r:str(''.join(str(r[col]) for col in df_oh.columns)),axis=1)    
df_concat
Out[37]:
0    01001
1    10010
2    00101
dtype: object

pd.get_dummies(df_concat)
Out[39]:
   00101  01001  10010
0      0      1      0
1      0      0      1
2      1      0      0

推荐阅读