Pandas,反向独热编码

3
我对一个变量进行了一次独热编码,经过一些计算后,我希望能够恢复到原始变量。
我的做法是:
1.筛选独热编码列的名称(它们都以原始变量的名称开头,比如说'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'

有没有关于如何继续进行的建议?这是否是最佳方法,或者是否有某个函数恰好符合我的需求?

根据请求,这里提供一个示例,取自此处

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

df=pd.get_dummies(df)

1
你需要 (X_test[filter_col]*filter_col).sum() 还是 (X_test[filter_col]*filter_col).sum(axis=1) - jezrael
1
X_test[filter_col].idxmax(1).str.replace('mycol_', '') 是关于编程的内容,无法直接翻译成中文。请提供更多上下文或者更具体的信息,以便进行准确翻译。 - Chris Adams
@jezrael,你的第一条评论就是解决方案:(X_test[filter_col]*filter_col).sum(axis=1)。你能把它发表为答案,这样我就可以接受它了吗? - CAPSLOCK
1
@ChrisA 谢谢 Chris =) 你更进一步,还清理了结果。 - CAPSLOCK
好的,所以每行永远只有一个 1,是吗?如果是,那么接受的解决方案可行,否则不行。 - jezrael
显示剩余5条评论
2个回答

2

如果需要按行求和:

最初的回答:

(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

如果我理解正确,您可以使用DataFrame.idxmaxaxis=1。 如果必要,您可以使用str.replace替换虚拟前缀:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接