我想从这个 Dataframe 开始,它基本上是一个热编码。
In [2]: pd.DataFrame({"monkey":[0,1,0],"rabbit":[1,0,0],"fox":[0,0,1]})
Out[2]:
fox monkey rabbit
0 0 0 1
1 0 1 0
2 1 0 0
3 0 0 0
4 0 0 0
到这个是“反向”独热编码的。
In [3]: pd.DataFrame({"animal":["monkey","rabbit","fox"]})
Out[3]:
animal
0 monkey
1 rabbit
2 fox
我想有一些聪明的使用apply或zip来做事情,但我不知道怎么做...有人能帮忙吗?
我还没有太多的成功使用索引等试图解决这个问题。
9条答案
按热度按时间xienkqul1#
这将为每一行选择一个列标签,其中标签具有最大值。由于数据是1和0,它将选择1的位置。
演示:
试试这个:
数据:
9gm1akwq2#
我将使用apply来解码列:
2uluyalo3#
这适用于单个标签和多个标签。
我们可以使用高级索引来解决这个问题。这里是链接。
结果是:
说明:我们迭代 Dataframe 上的列。
上面的代码行基本上可以找到df[col_name] == 1的所有位置,选择列“tags”并将其设置为RHS值,即df ['tags']+' '+ col_name
注意:
.ix
自Pandas v0.20起已弃用。您应根据需要改用.loc
或.iloc
。hfsqlsce4#
我会这样做:
时间
小号x1毫米1x 5 x 3
大号x 1米1英寸x 100万x 52英寸
wi3ka0sx5#
您可以尝试使用
melt()
。当一行有多个OHE标签时,此方法也有效。dojqjjoe6#
从panda 1.5.0开始,
pandas.from_dummies
直接支持反转独热码编码:生成的DataFrame似乎没有列标题(它是一个空字符串)。要解决此问题,请对
from_dummies
之后的列执行rename
操作或者,如果DataFrame已定义为具有单独的列(如
pandas.get_dummies
生成的one-hot编码),* 例如 *只需指定
sep
即可反转编码sep
分隔符的第一个示例之前的字符串将成为新DataFrame中的列标题(在本例中为“animal”),字符串的其余部分将成为列值(在本例中为“rabbit”、“monkey”、“fox”)。m2xkgtsf7#
试试这个:
42fyovps8#
它可以通过简单的 Dataframe 应用程序来实现
moiiocjp9#
一种不用for循环就可以处理多个标签的方法。结果将是一个列表列。如果每行的标签数相同,则可以添加
result_type='expand'
以获得多个列。