如何依据Series数值将DataFrame数据按固定间隔分组
按型号批次分箱实现方案
原始数据
1. 批次数据DataFrame(df1)
df1 = pd.DataFrame({'model':['A','A','A','A','A','B','B','B','B','C','C','C','C','C'], 'lot':['a1','a2','a3','a4','a5','b1','b2','b3','b4','c1','c2','c3','c4','c5']})
对应数据结构:
| model | lot |
|---|---|
| A | a1 |
| A | a2 |
| A | a3 |
| A | a4 |
| A | a5 |
| B | b1 |
| B | b2 |
| B | b3 |
| B | b4 |
| C | c1 |
| C | c2 |
| C | c3 |
| C | c4 |
| C | c5 |
2. 箱容量Series(s1)
s1 = pd.Series({'A':3, 'B':2,'C':4}, name='box_volume')
对应数据:
| model | box_volume |
|---|---|
| A | 3 |
| B | 2 |
| C | 4 |
分箱规则
- 同型号批次按对应箱容量依次装箱,装满一个箱后启用下一个新箱
- 型号切换时重新开始计数装箱,全局箱号按顺序延续
具体示例:
- 型号A共5个批次,箱容量3,对应
box_1(装a1、a2、a3)和box_2(装a4、a5) - 型号B共4个批次,箱容量2,对应
box_3(装b1、b2)和box_4(装b3、b4) - 型号C共5个批次,箱容量4,对应
box_5(装c1、c2、c3、c4)和box_6(装c5)
实现代码
import pandas as pd # 加载原始数据 df1 = pd.DataFrame({'model':['A','A','A','A','A','B','B','B','B','C','C','C','C','C'], 'lot':['a1','a2','a3','a4','a5','b1','b2','b3','b4','c1','c2','c3','c4','c5']}) s1 = pd.Series({'A':3, 'B':2,'C':4}, name='box_volume') # 合并箱容量信息到批次数据 df = df1.merge(s1, on='model', how='left') # 按型号分组,计算每个批次在当前型号内的箱序号 df['box_num_in_model'] = df.groupby('model').cumcount() // df['box_volume'] + 1 # 计算各型号的总箱数,再推导全局箱号 model_box_counts = df.groupby('model').apply(lambda x: (x['lot'].count() + x['box_volume'].iloc[0] - 1) // x['box_volume'].iloc[0]) cum_box_counts = model_box_counts.cumsum().shift(fill_value=0) df['box_id'] = 'box_' + (df['model'].map(cum_box_counts) + df['box_num_in_model']).astype(str) # 整理最终结果 result = df[['model', 'lot', 'box_id']] print(result)
最终结果
| model | lot | box_id |
|---|---|---|
| A | a1 | box_1 |
| A | a2 | box_1 |
| A | a3 | box_1 |
| A | a4 | box_2 |
| A | a5 | box_2 |
| B | b1 | box_3 |
| B | b2 | box_3 |
| B | b3 | box_4 |
| B | b4 | box_4 |
| C | c1 | box_5 |
| C | c2 | box_5 |
| C | c3 | box_5 |
| C | c4 | box_5 |
| C | c5 | box_6 |
内容的提问来源于stack exchange,提问作者ghost_like
相关产品推荐
相关产品推荐

