pandas interval类型距离分箱计算累计值与累计百分比方案
实现步骤
1. 先对DataFrame按分箱列排序
interval类型原生支持大小比较,直接按distance_bin排序即可保证分箱顺序从小到大:
import pandas as pd # 按分箱从小到大排序,重置索引避免后续逻辑出错 df = df.sort_values("distance_bin").reset_index(drop=True)
2. 计算累计对象总数和累计百分比
这两个都是数值字段,直接用cumsum方法即可实现滚动累计:
# 累计对象总数 df["累计对象总数"] = df["分箱内对象数"].cumsum() # 累计百分比,如果需要转百分比展示可额外加format处理 df["累计百分比"] = df["分箱占比"].cumsum()
3. 生成累计分箱范围
不需要用expanding方法,直接提取最小分箱的左边界,和当前行分箱的右边界拼接为新的interval即可,同时保持和原分箱一致的开闭规则:
# 提取全量最小分箱的左边界 min_bin_left = df["distance_bin"].iloc[0].left # 逐行拼接累计区间 df["累计分箱范围"] = df["distance_bin"].apply( lambda x: pd.Interval(left=min_bin_left, right=x.right, closed=x.closed) )
效果示例
假设原输入数据如下:
| distance_bin | 分箱内对象数 | 分箱占比 |
|---|---|---|
| (0.0, 10.0] | 10 | 0.1 |
| (10.0, 20.0] | 20 | 0.2 |
| (20.0, 30.0] | 30 | 0.3 |
| (30.0, 40.0] | 40 | 0.4 |
处理后输出结果:
| distance_bin | 分箱内对象数 | 分箱占比 | 累计对象总数 | 累计百分比 | 累计分箱范围 |
|---|---|---|---|---|---|
| (0.0, 10.0] | 10 | 0.1 | 10 | 0.1 | (0.0, 10.0] |
| (10.0, 20.0] | 20 | 0.2 | 30 | 0.3 | (0.0, 20.0] |
| (20.0, 30.0] | 30 | 0.3 | 60 | 0.6 | (0.0, 30.0] |
| (30.0, 40.0] | 40 | 0.4 | 100 | 1.0 | (0.0, 40.0] |
原理说明
pandas的expanding方法默认针对数值类型做滚动聚合,interval属于自定义复合类型,没有默认的累加规则,因此不用硬套expanding方法,单独处理区间列的逻辑更简单高效。
内容的提问来源于stack exchange,提问作者Serge de Gosson de Varennes
相关产品推荐
相关产品推荐

