基于Model和Class拆分Lot_1生成Lot_2的Pandas数据处理需求
Pandas按分组拆分生成新编号列问题
原始数据
给定包含model、lot_1、class三列的DataFrame:
import pandas as pd df = pd.DataFrame({'model':['A','A','A','A', 'A','A','A','A','B','B','B','B','B','B'], 'lot_1':[0,0,0,0,0,1,2,2,0,0,1,1,2,2], 'class':['0','3','3','2','2','1','5','5','0','0','0','1','1','1']})
需求
- 按
model分组,基于class拆分lot_1生成Lot_2列 - 保留
lot_1的原有顺序,class仅作区分,无大小/顺序意义 - 同一
lot_1下不同class需按顺序分配新编号 - 切换
model时,Lot_2从0重新开始编号
期望输出
最终DataFrame如下:
| model | lot_1 | class | Lot_2 |
|---|---|---|---|
| A | 0 | 0 | 0 |
| A | 0 | 3 | 1 |
| A | 0 | 3 | 1 |
| A | 0 | 2 | 2 |
| A | 0 | 2 | 2 |
| A | 1 | 1 | 3 |
| A | 2 | 5 | 4 |
| A | 2 | 5 | 4 |
| B | 0 | 0 | 0 |
| B | 0 | 0 | 0 |
| B | 1 | 0 | 1 |
| B | 1 | 1 | 2 |
| B | 2 | 1 | 3 |
| B | 2 | 1 | 3 |
解决方案
直接通过分组+因子化实现,代码简洁高效:
# 按model分组,对每组内的(lot_1, class)组合按出现顺序编号 df['Lot_2'] = df.groupby('model').apply( lambda g: pd.factorize(zip(g['lot_1'], g['class']))[0] ).explode().astype(int) # 验证结果 print(df)
逻辑说明
- 分组隔离:
groupby('model')确保不同model的编号完全独立,切换时自动重置 - 组合标识:把
lot_1和class绑成元组,作为判断是否需要新编号的唯一依据 - 顺序编号:
pd.factorize()会按元组首次出现的顺序分配从0开始的连续整数,重复的组合复用同一个编号 - 还原结构:
explode()把分组处理的结果拆回原DataFrame的行结构,astype(int)保证编号为整数类型
内容的提问来源于stack exchange,提问作者ghost_like
相关产品推荐
相关产品推荐

