如何在Pandas DataFrame中为用户生成会话序号与问题序号列
生成用户会话序号与问题序号的Pandas实现
首先是你提供的示例数据生成代码:
import pandas as pd usr_id = [121,121,121,121,135,135,135,135,135,135,135,135,135] ses_id = [95,95,95,108,97,97,97,97,98,98,98,101,101] que_id = [1,8,15,23,1,42,9,5,7,9,10,17,20] df = pd.DataFrame(list(zip(usr_id, ses_id, que_id)), columns =['usr_id', 'ses_id', 'que_id'])
生成问题序号(que_no)
你之前的写法是可行的,为了更清晰体现会话归属用户的逻辑,也可以按usr_id和ses_id组合分组:
# 每个会话内的问题按出现顺序编号,从1开始 df['que_no'] = df.groupby(['usr_id', 'ses_id']).cumcount() + 1
生成会话序号(ses_no)
用Pandas原生的factorize结合分组transform就能高效实现每个用户的会话按顺序编号:
# 每个用户下的会话按首次出现顺序编号,从1开始 df['ses_no'] = df.groupby('usr_id')['ses_id'].transform(lambda x: x.factorize()[0] + 1)
最终结果
执行上述代码后,DataFrame的结构如下:
| usr_id | ses_id | que_id | que_no | ses_no |
|---|---|---|---|---|
| 121 | 95 | 1 | 1 | 1 |
| 121 | 95 | 8 | 2 | 1 |
| 121 | 95 | 15 | 3 | 1 |
| 121 | 108 | 23 | 1 | 2 |
| 135 | 97 | 1 | 1 | 1 |
| 135 | 97 | 42 | 2 | 1 |
| 135 | 97 | 9 | 3 | 1 |
| 135 | 97 | 5 | 4 | 1 |
| 135 | 98 | 7 | 1 | 2 |
| 135 | 98 | 9 | 2 | 2 |
| 135 | 98 | 10 | 3 | 2 |
| 135 | 101 | 17 | 1 | 3 |
| 135 | 101 | 20 | 2 | 3 |
原理说明:factorize()会将每个用户组内的唯一ses_id映射为从0开始的整数,加1后得到从1开始的会话序号;transform方法保证结果对齐到原DataFrame的每一行。
内容的提问来源于stack exchange,提问作者mayur_m
相关产品推荐
相关产品推荐

