基于分类变量滚动值创建过往高级经理经验虚拟变量
实现过往资深经理经验虚拟变量的方案
原始数据
| date | name | rolename | firmname |
|---|---|---|---|
| 2011-12-01 | John | helper | A |
| 2012-12-01 | John | helper | A |
| 2013-12-01 | John | helper | A |
| 2014-12-01 | John | helper | B |
| 2014-12-01 | John | senior manager | C |
| 2015-12-01 | John | helper | B |
| 2015-12-01 | John | senior manager | C |
| 2016-12-01 | John | senior manager | C |
| 2016-12-01 | John | senior manager | D |
| 2017-12-01 | John | helper | E |
| 2011-12-01 | Will | senior manager | A |
| 2012-12-01 | Will | senior manager | A |
| 2013-12-01 | Will | senior manager | Z |
需求说明
需要新增虚拟变量 dummy_sm_exp:当个人拥有其他公司的过往senior manager任职经验时,该变量取值为1,否则为0。具体规则:一旦个人在某家公司之外的其他公司担任过senior manager,从该时间点开始,所有后续记录(无论当前职位是什么)的dummy_sm_exp都为1。
示例结果
| date | name | rolename | firmname | dummy_sm_exp |
|---|---|---|---|---|
| 2011-12-01 | John | helper | A | 0 |
| 2012-12-01 | John | helper | A | 0 |
| 2013-12-01 | John | helper | A | 0 |
| 2014-12-01 | John | helper | B | 0 |
| 2014-12-01 | John | senior manager | C | 0 |
| 2015-12-01 | John | helper | B | 0 |
| 2015-12-01 | John | senior manager | C | 0 |
| 2016-12-01 | John | senior manager | C | 0 |
| 2016-12-01 | John | senior manager | D | 1 |
| 2017-12-01 | John | helper | E | 1 |
| 2011-12-01 | Will | senior manager | A | 0 |
| 2012-12-01 | Will | senior manager | A | 0 |
| 2013-12-01 | Will | senior manager | Z | 1 |
实现思路与代码(Python pandas)
核心逻辑
- 按姓名分组,提取每个用户的senior manager任职记录
- 追踪用户到每个时间点为止的SM任职公司集合,判断是否存在两家及以上不同公司的经验
- 找到用户第一次满足条件的时间点,将该时间点及之后的所有记录的虚拟变量设为1
代码实现
import pandas as pd # 加载原始数据(实际场景可替换为pd.read_csv等读取文件的方法) data = pd.DataFrame({ 'date': ['2011-12-01', '2012-12-01', '2013-12-01', '2014-12-01', '2014-12-01', '2015-12-01', '2015-12-01', '2016-12-01', '2016-12-01', '2017-12-01', '2011-12-01', '2012-12-01', '2013-12-01'], 'name': ['John']*10 + ['Will']*3, 'rolename': ['helper', 'helper', 'helper', 'helper', 'senior manager', 'helper', 'senior manager', 'senior manager', 'senior manager', 'helper', 'senior manager', 'senior manager', 'senior manager'], 'firmname': ['A', 'A', 'A', 'B', 'C', 'B', 'C', 'C', 'D', 'E', 'A', 'A', 'Z'] }) # 转换日期格式为datetime,确保时间比较的准确性 data['date'] = pd.to_datetime(data['date']) # 初始化虚拟变量为0 data['dummy_sm_exp'] = 0 # 按姓名分组处理每个用户的记录 for name, group in data.groupby('name'): # 提取该用户所有senior manager的任职记录,按日期排序 sm_group = group[group['rolename'] == 'senior manager'].sort_values('date') if len(sm_group) < 2: continue # 只有一次或没有SM任职,无需修改虚拟变量 # 计算到每个日期为止,该用户担任SM的公司集合 sm_group['sm_firms'] = sm_group['firmname'].expanding().apply(lambda x: set(x)) # 找到第一个拥有两家及以上不同公司SM经验的日期 first_qualified_date = sm_group[sm_group['sm_firms'].apply(len) > 1]['date'].min() # 将该用户所有日期>=first_qualified_date的记录,dummy设为1 data.loc[(data['name'] == name) & (data['date'] >= first_qualified_date), 'dummy_sm_exp'] = 1 # 输出结果(可替换为保存到文件) print(data.to_string(index=False))
代码说明
- 日期格式转换:确保后续时间比较的正确性
- 分组处理:针对每个用户单独分析其SM任职轨迹
- 窗口计算:通过
expanding窗口逐步累积用户的SM任职公司,判断是否满足多公司经验条件 - 批量更新:找到第一个满足条件的时间点后,一次性更新该用户后续所有记录的虚拟变量
内容的提问来源于stack exchange,提问作者fsure
相关产品推荐
相关产品推荐

