[英]What is the fastest way to do inverse multi-hot encoding in pandas?
在大型 DataFrame 上进行反向“多热”(如具有多个同时类别的单热)操作的最快方法是什么?
我有以下数据帧:
id type_A type_B type_C
1 1 1 0
2 0 1 0
3 0 1 1
该操作将给出:
id type
1 type_A
1 type_B
2 type_B
3 type_B
3 type_C
使用melt
和query
:
df = df.melt(id_vars='id', value_vars=['type_A', 'type_B', 'type_C']).query('value == 1')
id variable value
0 1 type_A 1
3 1 type_B 1
4 2 type_B 1
5 3 type_B 1
8 3 type_C 1
使用正确的列名:
df = (
df.melt(id_vars='id',
value_vars=['type_A', 'type_B', 'type_C'],
var_name='type')
.query('value == 1')
.drop(columns='value')
)
id type
0 1 type_A
3 1 type_B
4 2 type_B
5 3 type_B
8 3 type_C
融化应该是实现这一目标的正常方法
yourdf=df.melt('id').loc[lambda x : x['value']==1]
id variable value
0 1 type_A 1
3 1 type_B 1
4 2 type_B 1
5 3 type_B 1
8 3 type_C 1
这是一个带有.dot
的解决方案,它使用矩阵乘法与series.explode()
帮助的列,这是版本0.25+
新0.25+
:
m = df.set_index('id')
m.dot(m.columns+',').str.rstrip(',').str.split(',').explode().reset_index(name='type')
id type
0 1 type_A
1 1 type_B
2 2 type_B
3 3 type_B
4 3 type_C
用:
new_df = (df.set_index('id')
.where(lambda x: x.eq(1))
.stack()
.rename_axis(['id','type'])
.reset_index()[['id','type']] )
print(new_df)
id type
0 1 type_A
1 1 type_B
2 2 type_B
3 3 type_B
4 3 type_C
df.melt(id_vars='id', ).query('value == 1').drop(columns='value').rename(columns={"variable":"type"})
想要的结果:
id type
0 1 type_A
3 1 type_B
4 2 type_B
5 3 type_B
8 3 type_C
您可以用NaN
和stack
替换所有零。 通过堆叠所有NaN
值都将被丢弃。 然后您可以获得MultiIndex
并将其转换为数据框:
df = df.set_index('id') # set 'id' to index if necessary
df.replace(0, np.nan).stack().index.to_frame(index=False, name=['id', 'type'])
输出:
id type
0 1 type_A
1 1 type_B
2 2 type_B
3 3 type_B
4 3 type_C
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.