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

Pandas技术问询:如何对大范围数据中的相近值合理分组?

针对DataFrame长尾数据的倍数约束分组方案

你遇到的问题核心是长尾分布数据的分组:90%数值集中在小范围,剩余10%极大且分散,常规分位数或静态阈值无法满足“组内任意数值不超过另一数值2倍”的要求。以下是两种精准解决的方法:

方法1:动态迭代式倍数分组(最贴合需求)

思路:先对数据排序,从第一个元素开始,将所有≤当前组最大值*2的元素划入同一组;当遇到超过该阈值的元素时,开启新组,重复此逻辑。这种方法完全遵循你要求的“组内倍数≤2”规则。

代码实现

import pandas as pd

def group_by_multiple(df, col_name, max_ratio=2):
    # 先排序并重置索引
    sorted_df = df.sort_values(col_name).reset_index(drop=True)
    groups = []
    current_group = 0
    current_max = sorted_df[col_name].iloc[0]
    
    for val in sorted_df[col_name]:
        if val <= current_max * max_ratio:
            groups.append(current_group)
            # 更新当前组的最大值(如果当前值更大)
            if val > current_max:
                current_max = val
        else:
            current_group += 1
            groups.append(current_group)
            current_max = val
    
    sorted_df['group'] = groups
    return sorted_df

# 示例使用:假设你的DataFrame名为df,目标列是'values'
result_df = group_by_multiple(df, 'values', max_ratio=2)

效果说明

  • 对于你提到的组0需要拆分的情况,该方法会自动将组0中超过当前最大值2倍的元素拆分到新组;
  • 对于尾部分散的大数值,会自动合并满足倍数要求的相邻元素,避免过度拆分。

方法2:对数转换+分位数分组(适合快速分组)

思路:长尾数据在对数空间会呈现更均匀的分布,先对目标列做对数转换,再用分位数分组,最后将分组映射回原数据空间。这种方法能间接控制组内的倍数关系(对数空间的等间距对应原空间的等倍数)。

代码实现

import pandas as pd
import numpy as np

def group_by_log_quantile(df, col_name, n_groups=10):
    # 避免0值报错,加一个极小值
    df['log_val'] = np.log(df[col_name] + 1e-8)
    # 用分位数分组
    df['group'] = pd.qcut(df['log_val'], q=n_groups, labels=False)
    # 可选:删除临时列
    df = df.drop('log_val', axis=1)
    return df

# 示例使用
result_df = group_by_log_quantile(df, 'values', n_groups=10)

效果说明

  • 对数转换后,原数据的倍数差异转为对数空间的差值,分位数分组能保证每组在对数空间的范围相近,对应原空间的倍数相近;
  • 可以调整n_groups的数量来控制分组粒度,确保组内倍数≤2。

验证你的示例数据

针对你给出的分位数数据(0.8分位205.6,0.9分位9114):

  • 方法1会将205.6及以下的元素按倍数规则拆分,9114会单独成组(因为9114 > 205.6*2=411.2);
  • 方法2中,对数转换后205.6的log值约为5.32,9114的log值约为9.12,分位数分组会将这两个值分到不同组,避免组内差异过大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:42:21