基于elif逻辑为DataFrame多列分配数值的技术实现问题
解决DataFrame多列按逻辑分配物料数量的问题
现有代码逻辑
已实现type为Linear Section时,qty在指定区间的物料分配:
import pandas as pd import numpy as np # 示例DataFrame df = pd.DataFrame({ 'type': ['Linear Section']*5, 'qty': [7, 8.5, 9.5, 10.5, 46], 'wall sides': [1]*5 }) # 基础区间分配 df['8footer'] = ((df[(df['type'] == 'Linear Section') & (df.qty <= 8.17)]['qty'] * df['wall sides'])).fillna(0) df['9footer'] = ((df[(df['type'] == 'Linear Section') & (df.qty > 8.17) & (df.qty <= 9.17)]['qty'] * df['wall sides'])).fillna(0) df['10footer'] = ((df[(df['type'] == 'Linear Section') & (df.qty > 9.17) & (df.qty <= 10.17)]['qty'] * df['wall sides'])).fillna(0) df['12footer'] = ((df[(df['type'] == 'Linear Section') & (df.qty > 10.17) & (df.qty <= 14)]['qty'] * df['wall sides'])).fillna(0)
待处理场景:qty > 14
需要将qty按最大规格12拆分:
- 整除12的部分直接计入
12footer - 余数
x = qty % 12按区间分配到对应列:x < 8.17→8footer8.17 < x ≤ 9.17→9footer9.17 < x ≤ 10.17→10footerx > 10.17→12footer
解决方案(向量化实现)
通过向量化运算高效处理,避免循环:
# 筛选目标行 mask = (df['type'] == 'Linear Section') & (df['qty'] > 14) target_qty = df.loc[mask, 'qty'] * df.loc[mask, 'wall sides'] # 计算整除部分和余数 div_part = (target_qty // 12) * 12 remainder = target_qty % 12 # 创建余数分配的临时DataFrame remainder_df = pd.DataFrame(0, index=target_qty.index, columns=['8footer', '9footer', '10footer', '12footer']) # 按余数区间赋值 remainder_df.loc[remainder < 8.17, '8footer'] = remainder remainder_df.loc[(remainder > 8.17) & (remainder <= 9.17), '9footer'] = remainder remainder_df.loc[(remainder > 9.17) & (remainder <= 10.17), '10footer'] = remainder remainder_df.loc[remainder > 10.17, '12footer'] = remainder # 加上整除部分到12footer remainder_df['12footer'] += div_part # 更新原DataFrame df.loc[mask, remainder_df.columns] = remainder_df
最终结果
执行后得到符合预期的输出:
| index | type | qty | wall sides | 8footer | 9footer | 10footer | 12footer |
|---|---|---|---|---|---|---|---|
| 0 | Linear Section | 7 | 1 | 7 | 0 | 0 | 0 |
| 1 | Linear Section | 8.5 | 1 | 0 | 8.5 | 0 | 0 |
| 2 | Linear Section | 9.5 | 1 | 0 | 0 | 9.5 | 0 |
| 3 | Linear Section | 10.5 | 1 | 0 | 0 | 0 | 10.5 |
| 4 | Linear Section | 46 | 1 | 0 | 0 | 10 | 36 |
注意事项
- 自动适配
wall sides的倍数计算,与原有逻辑保持一致 - 向量化运算性能优于
apply或循环,适合大数据集 - 先执行基础区间分配,再覆盖
qty>14的场景,确保逻辑不冲突
内容的提问来源于stack exchange,提问作者canconfirm24
相关产品推荐
相关产品推荐

