熊猫,反转一种热门编码方式

时间:2019-06-20 08:27:52

标签: python pandas one-hot-encoding

我对一个变量进行了热编码,经过一些计算后,我想检索原始变量。

我正在做的是以下事情:

我过滤了一个热编码的列名(它们都以原始变量的名称开头,例如'mycol'

filter_col = [col for col in df if col.startswith('mycol')]

然后,我可以简单地将列名乘以过滤后的变量。

X_test[filter_col]*filter_col

但是,这导致了稀疏矩阵。如何从中创建一个变量?求和不起作用,因为将空白视为数字并执行以下操作:sum(X_test[filter_col]*filter_col)我得到

TypeError: unsupported operand type(s) for +: 'int' and 'str'

关于如何进行的任何建议?这甚至是最好的方法,还是那里有功能完全满足我的需求?

根据请求,以下是一个示例,摘自here

df= pd.DataFrame({ 
    'mycol':np.random.choice( ['panda','python','shark'], 10),
    })

df=pd.get_dummies(df)

2 个答案:

答案 0 :(得分:1)

如果需要每行的总和值:

(X_test[filter_col]*filter_col).sum(axis=1)

解决方案(如果可能)每行仅0或每行多个1

X_test = pd.DataFrame({
         'mycolB':[0,1,1,0],
         'mycolC':[0,0,1,0],
         'mycolD':[1,0,0,0],

})


filter_col = [col for col in X_test if col.startswith('mycol')]
df = X_test[filter_col].dot(pd.Index(filter_col) + ', ' ).str.strip(', ')
print (df)
0            mycolD
1            mycolB
2    mycolB, mycolC
3                  
dtype: object

答案 1 :(得分:1)

IIUC,您可以在axis=1中使用DataFrame.idxmax。如有必要,您可以用str.replace替换虚拟前缀:

X_test[filter_col].idxmax(axis=1).str.replace('mycol_', '')