Python 如何将(不是一个)热编码转换为同一行上具有多个值的列
我基本上是想扭转这个过程 关于反转一个热编码有很多问题(示例&),但答案取决于每行只有一个二进制类处于活动状态,而我的数据可以在同一行中有多个类处于活动状态 接近于解决我需要的问题,但它的多个类在不同的行上分开。我需要我的结果是由分隔符(例如“,”)连接的字符串,这样输出的行数与输入的行数相同 使用这两个问题(&)中的思想,我能够想出一个解决方案,但它需要一个普通的python for循环来遍历行,我怀疑与完全使用pandas的解决方案相比,这会很慢Python 如何将(不是一个)热编码转换为同一行上具有多个值的列,python,pandas,numpy,dataframe,one-hot-encoding,Python,Pandas,Numpy,Dataframe,One Hot Encoding,我基本上是想扭转这个过程 关于反转一个热编码有很多问题(示例&),但答案取决于每行只有一个二进制类处于活动状态,而我的数据可以在同一行中有多个类处于活动状态 接近于解决我需要的问题,但它的多个类在不同的行上分开。我需要我的结果是由分隔符(例如“,”)连接的字符串,这样输出的行数与输入的行数相同 使用这两个问题(&)中的思想,我能够想出一个解决方案,但它需要一个普通的python for循环来遍历行,我怀疑与完全使用pandas的解决方案相比,这会很慢 输入数据帧可以使用实际的布尔值,而不是整数编
输入数据帧可以使用实际的布尔值,而不是整数编码,如果它使事情变得更简单的话。输出可以是数据帧或序列;我最终将把结果列添加到一个更大的数据帧中。如果允许更好的解决方案,我也愿意使用
numpy
,但如果允许更好的解决方案,我更愿意坚持使用pandas
下面是一个使用python列表理解来迭代每一行的解决方案:
import pandas as pd
def reverse_hot_encoding(df, sep=', '):
df = df.astype(bool)
l = [sep.join(df.columns[row]) for _, row in df.iterrows()]
return pd.Series(l)
if __name__ == '__main__':
example_input = pd.DataFrame({"one" : [0,1,0,1,0],
"two" : [0,0,0,0,0],
"three" : [1,1,1,1,0],
"four" : [1,1,0,0,0]
})
print(reverse_hot_encoding(example_input))
以下是输出:
0 three, four
1 one, three, four
2 three
3 one, three
4
dtype: object
0 three, four
1 one, three, four
2 three
3 one, three
4
dtype: object
您可以执行比迭代数据帧中的所有行快得多的操作:
df.dot(df.columns + ', ').str.rstrip(', ')
0 three, four
1 one, three, four
2 three
3 one, three
4
dtype: object