如何合并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
相关产品推荐
相关产品推荐

