You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并pandas DataFrame中pd.cut生成的均值差低于阈值的相邻分箱

实现方法

你可以按以下步骤完成相邻分箱的合并逻辑:

步骤1:补充生成分箱统计信息

在你现有代码的基础上,首先提取每个分箱的左右边界、均值(如果需要更严谨的加权均值判断,建议同时统计每个分箱的样本数):

# 原有代码到df2的部分可以调整为同时统计分箱内样本数,方便后续加权计算
df2 = df.groupby('bin1')['val'].agg(mean_val='mean', count='count').reset_index()

threshold = 5

步骤2:遍历合并符合条件的相邻分箱

# 初始化合并后的分箱列表,先存入第一个分箱的信息
merged_bins = []
for _, row in df2.iterrows():
    current_left = row['bin1'].left
    current_right = row['bin1'].right
    current_mean = row['mean_val']
    current_count = row['count']
    
    if not merged_bins:
        merged_bins.append({
            'left': current_left,
            'right': current_right,
            'mean': current_mean,
            'count': current_count
        })
        continue
    
    # 取上一个已经合并的分箱做对比
    last_bin = merged_bins[-1]
    if abs(current_mean - last_bin['mean']) < threshold:
        # 差值低于阈值,合并分箱:更新右边界、加权均值、样本数
        last_bin['right'] = current_right
        total_count = last_bin['count'] + current_count
        last_bin['mean'] = (last_bin['mean'] * last_bin['count'] + current_mean * current_count) / total_count
        last_bin['count'] = total_count
    else:
        merged_bins.append({
            'left': current_left,
            'right': current_right,
            'mean': current_mean,
            'count': current_count
        })

步骤3:用合并后的边界重新生成分箱

# 提取新的分箱边界数组
new_bin_edges = [merged_bins[0]['left']] + [bin_info['right'] for bin_info in merged_bins]

# 对原数据重新分箱
df['final_bin'] = pd.cut(df['col1'], bins=new_bin_edges)

# 输出所有合并后的分箱
print(df['final_bin'].unique().sort_values())

输出结果

运行后得到的最终分箱和你预期一致:

[(6.987, 15.667], (15.667, 20.0]]
Categories (2, interval[float64, right]): [(6.987, 15.667] < (15.667, 20.0]]

内容的提问来源于stack exchange,提问作者procaffienator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:54:01