Pandas如何基于列X与分桶参数高效生成符合累加规则的新列
Pandas 按阈值逐行拆分分桶的高效实现
实现逻辑
核心采用pandas向量化截断运算,完全避免Python层面的逐行循环,支持任意数量的分桶列扩展,运行效率极高。
代码实现
首先导入依赖、构造示例数据:
import pandas as pd # 示例数据 data = {'X':[0,0,10,10,10,15,20,50,50,55,80,100,1500]} df = pd.DataFrame(data) # 分桶配置,后续新增分桶只需要修改这个列表即可,不用调整逻辑 bucket_config = [ ('A', 10), ('B', 50), ('C', 100), ('D', 300) ]
核心运算逻辑:
# 初始化剩余待分配值 remain = df['X'].copy() for col_name, threshold in bucket_config: # 当前列取值为剩余值和阈值的较小值 df[col_name] = remain.clip(upper=threshold) # 更新剩余待分配值 remain -= df[col_name]
输出结果验证
运行后输出df即可得到和预期完全一致的结果:
| Index | X | A | B | C | D |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 | 0 | 0 |
| 2 | 10 | 10 | 0 | 0 | 0 |
| 3 | 10 | 10 | 0 | 0 | 0 |
| 4 | 10 | 10 | 0 | 0 | 0 |
| 5 | 15 | 10 | 5 | 0 | 0 |
| 6 | 20 | 10 | 10 | 0 | 0 |
| 7 | 50 | 10 | 40 | 0 | 0 |
| 8 | 50 | 10 | 40 | 0 | 0 |
| 9 | 55 | 10 | 45 | 0 | 0 |
| 10 | 80 | 10 | 50 | 20 | 0 |
| 11 | 100 | 10 | 50 | 40 | 0 |
| 12 | 1500 | 10 | 50 | 100 | 300 |
效率说明
所有运算均调用numpy底层实现,仅遍历分桶配置的列数(而非行数),就算是百万级行数、上百个分桶列的场景,也能在毫秒级完成运算。
内容的提问来源于stack exchange,提问作者ABC
相关产品推荐
相关产品推荐

