Python中为按age排序的DataFrame基于y_hat值变化分箱的实现方法
Pandas 按相邻行y_hat值变化分配分箱编号实现方案
你可以通过shift()和cumsum()的组合逻辑实现需求,代码简洁执行效率高,不需要额外自定义循环:
完整可运行代码
import pandas as pd # 构造示例测试数据 df = pd.DataFrame({ 'age': [1, 1, 2, 3, 3, 3, 3], 'y_hat': [0.2, 11.5, 11.5, 11.5, 8, 8, 0.2] }) # 核心分箱逻辑:相邻行y_hat值不同则分箱编号+1 df['bin'] = (df['y_hat'] != df['y_hat'].shift()).cumsum() print(df)
输出结果
age y_hat bin 0 1 0.2 1 1 1 11.5 2 2 2 11.5 2 3 3 11.5 2 4 3 8.0 3 5 3 8.0 3 6 3 0.2 4
逻辑说明
df['y_hat'].shift()作用是将y_hat列整体向下偏移一行,使得当前行可以直接和上一行的y_hat值做对比!=判断得到布尔序列,值变化的位置返回True对应数值1,无变化返回False对应数值0cumsum()对布尔序列累加,每次遇到值变化的位置分箱编号自动+1,完全符合你的分箱规则
如果担心浮点数存储精度导致相等判断出错,可以替换核心逻辑为如下写法,规避精度问题:
import numpy as np df['bin'] = (~np.isclose(df['y_hat'], df['y_hat'].shift())).cumsum()
内容的提问来源于stack exchange,提问作者HilaD
相关产品推荐
相关产品推荐

