写在前面 : 这个任务如何直接读取每一行然后列表构造倒是不太复杂,只是比较慢,这里是提供一个利用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()
最后的结果如下图