pandas中基于企业、年份生成永久生效哑变量的高效实现方法
高效实现方案
核心思路是用Pandas原生的矢量化分组累积操作替代逐行循环,性能提升可达数百倍,适合大规模数据集。
实现步骤
- 先对数据集按企业ID、年份排序,确保时间顺序正确,避免原始数据乱序导致逻辑错误
- 构造标记列:
Value == 2的位置标记为1,其余为0 - 按企业ID分组,对标记列做累积最大值操作:只要该企业到当前行为止出现过1(即出现过
Value=2),后续所有行的累积最大值都会保持为1 - 用1减去上述累积最大值,即可得到符合要求的
Desired字段
完整代码
import pandas as pd # 构造示例数据,实际使用时替换成自己的数据集即可 d = {'firm_id': ["0000001" , "0000001","0000001","0000001","0000001","0000001","0000002","0000002","0000002","0000003", "0000003","0000003","0000003"], 'year': [2000,2001,2002,2003,2004,2005,2000,2001,2002,2000,2001,2002,2003], 'Value':[1,1,2,2,1,1,2,2,2,1,1,1,1]} df = pd.DataFrame(data=d) # 核心逻辑 df = df.sort_values(['firm_id', 'year']).reset_index(drop=True) df['Desired'] = 1 - df.assign(flag=lambda x: x['Value'] == 2)\ .groupby('firm_id')['flag']\ .cummax()\ .astype(int)
结果验证
运行后输出的Desired字段和示例完全一致:
| firm_id | year | Value | Desired |
|---|---|---|---|
| 0000001 | 2000 | 1 | 1 |
| 0000001 | 2001 | 1 | 1 |
| 0000001 | 2002 | 2 | 0 |
| 0000001 | 2003 | 2 | 0 |
| 0000001 | 2004 | 1 | 0 |
| 0000001 | 2005 | 1 | 0 |
| 0000002 | 2000 | 2 | 0 |
| 0000002 | 2001 | 2 | 0 |
| 0000002 | 2002 | 2 | 0 |
| 0000003 | 2000 | 1 | 1 |
| 0000003 | 2001 | 1 | 1 |
| 0000003 | 2002 | 1 | 1 |
| 0000003 | 2003 | 1 | 1 |
内容的提问来源于stack exchange,提问作者jhh
相关产品推荐
相关产品推荐

