Pandas动态列分组:优化Col1范围分组求Col2中位数的方案问询
问题:基于Col1动态分组计算Col2中位数的优化方案
- 现有包含两列浮点值的pandas DataFrame,需基于第一列(Col1)的范围进行分组,通过
df.groupby()计算第二列(Col2)的中位数 - 最初采用等距分箱:当Col1取值范围为20至40时,用
np.linspace生成分步为2的分箱,但分组结果样本量分布不均,存在空组(中位数为NaN),信息性较差
原始数据(分组处理前)
| 索引 | Col1 | Col2 |
|---|---|---|
| 0 | 21.2 | 4 |
| 1 | 21.8 | 2 |
| 2 | 27 | 4 |
| 3 | 27 | 6 |
| 4 | 38.2 | 9 |
| 5 | 36.1 | 1 |
| 6 | 30 | 1 |
| 7 | 24.1 | 10 |
| 8 | 29.5 | 8 |
| 9 | 31 | 8 |
等距分箱分组结果
| 分组 | 中位数 | Col2值列表 |
|---|---|---|
| 20-22 | 3 | [2,4] |
| 22-24 | NaN | [0] |
| 24-26 | 10 | [10] |
| 26-28 | 5 | [4,6] |
| 28-30 | 8 | [8] |
| 30-32 | 4.5 | [1,8] |
| 32-34 | NaN | [0] |
| 34-36 | NaN | [0] |
| 36-38 | 1 | [1] |
| 38-40 | 9 | [9] |
注:两列呈正相关,预期中位数随分组编号递增,示例数据为随机生成
后续尝试与问题
- 手动创建numpy对数分箱数组:当Col1取值在1至10000之间时,分箱为1-10、10-100等,样本分布有所改善,但仍存在多个分箱中位数相同的问题(如多个分箱中位数为0,推测对应Col2值均为0)
- 理想状态:合并中位数相同的3-4个分箱,对数据分布不均的分箱进一步细分;硬编码判断并调整分箱过于繁琐,希望找到更优实现
目标
- Col1的分组方式合理,同时得到的10个Col2中位数有序且符合数据分布规律
- 解决当前结果中的NaN值和随机波动问题
提问
是否存在此类现成函数?或有更优的算法方案可以推荐?
PS:若此问题不适用于该论坛,请告知。已检索网络及本平台,未找到相关函数,仅找到基于多列的动态分组方案,但不符合需求。
内容的提问来源于stack exchange,提问作者smallio
相关产品推荐
相关产品推荐

