如何按分位数对DataFrame进行分组(而非仅计算分位数)
结论
按自定义分位点给数据做分组完全不需要用for-loop,主流数据处理库都有现成的向量化实现,运行效率比手写循环高很多。
具体实现(Python pandas 环境)
就用你给出的样例参数做演示:
- 待处理数据列:
[1,2,3,4,5,6,7,8,9,10] - 自定义分位点列表:
[0, 0.33, 0.66, 1] - 分组要求:按分位点切为3组,分组名无限制
直接调用pandas内置的qcut方法就能一步完成分箱,不需要写任何循环逻辑:
import pandas as pd # 构造测试DataFrame df = pd.DataFrame({'num': [1,2,3,4,5,6,7,8,9,10]}) # 传入自定义分位点,直接生成分组标签 quantile_list = [0, 0.33, 0.66, 1] df['group_id'] = pd.qcut(df['num'], q=quantile_list, labels=False)
运行后会自动按分位点切分数据:
- 数值落在0~0.33分位区间的,统一标记为第0组
- 数值落在0.33~0.66分位区间的,统一标记为第1组
- 数值落在0.66~1分位区间的,统一标记为第2组
如果需要自定义分组名称,只要给labels参数传入和分组数匹配的名称列表就行,哪怕分位点列表长度变化、分组数增减,代码逻辑都不需要调整。
其他可选方案
如果有更灵活的切分需求,也可以先用numpy的quantile方法算出每个分位点对应的实际数值阈值,再用pd.cut按固定阈值切分,整个过程依然是向量化运算,不需要手写for循环。
只有当你需要对每个分组执行完全独立、没有统一规则的特殊操作时,才需要遍历分组对象写循环,单纯的分位点切分分组步骤完全不需要用到循环。
内容的提问来源于stack exchange,提问作者Xixiaxixi
相关产品推荐
相关产品推荐

