利用pandas将每一行是一个列表的Series转为独热编码

写在前面 : 这个任务如何直接读取每一行然后列表构造倒是不太复杂,只是比较慢,这里是提供一个利用pandas比较简洁的实现方式同时也给自己做一个笔记,因为涉及到一些平时较少使用的函数

我有这样一个表,每个人有一个role_id,记录了每个人7天(day列2-8)的行为,有的人可能某天没有某种类型(type列)行为,有的人一天也可能有多个类型的行为
在这里插入图片描述
我想将每个人每天的所做的行为转为一个独热编码。下面是具体实现
第一步 :

# 先按role_id 和 day 分组, 对type列做unique聚合, 目的是得到每种类型行为是否做过, 然后转为DataFrame对象
tmp = evolve.groupby(['role_id', 'day'])["type"].agg("unique").to_frame(name="test")

tmp 就会转化为一个双层index的列表对象, 如下所示
在这里插入图片描述
第二步:

# 先使用.apply(pd.Series) 将test列的列表转化为Series对象,然后使用stack函数将每一列按行堆叠(具体可以去看看stack和unstack函数的使用方式)
tmp_oht = pd.get_dummies(tmp['test'].apply(pd.Series).stack())*1

第三步:

# 按role_id和day进行分组,然后求和就得到独热编码形式的结果
tmp_oht.groupby(['role_id', 'day']).sum()

最后的结果如下图
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值