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

Pandas按分组百分位数对列数据分类的实现问题

问题排查与解决方案

原代码的核心问题

  • 函数逻辑完全错位:apply传入的vol是单行数据,但你在函数里直接操作全局的vol1和分组对象,拿整列分组结果做比较,根本不是逐行判断的逻辑。
  • 连续比较写法错误:a < b < c在pandas里不生效,必须拆成(a < b) & (b < c)的形式,还要加括号避免优先级问题。
  • 重复计算且类型不匹配:每次调用函数都重复计算分组分位数,而且分组对象和标量没法直接比较,导致报错。

正确实现方式

先计算每个分组的分位数,映射到每行后再做条件判断,效率和逻辑都更合理:

import pandas as pd
import numpy as np

# 计算每个group的75%、90%分位数
group_quantiles = vol1.groupby('group')['TTQDN'].quantile([0.75, 0.9]).unstack()
group_quantiles.columns = ['q75', 'q90']

# 把分位数合并回原数据集
vol1 = vol1.merge(group_quantiles, on='group', how='left')

# 用条件生成分类
conditions = [
    vol1['TTQDN'] > vol1['q90'],
    (vol1['TTQDN'] > vol1['q75']) & (vol1['TTQDN'] <= vol1['q90'])
]
choices = [1, 2]
vol1['Ranking'] = np.select(conditions, choices, default=3)

# 清理临时列
vol1.drop(['q75', 'q90'], axis=1, inplace=True)

更简洁的transform写法

如果不想合并列,也可以用transform直接获取每行对应的分组分位数:

import pandas as pd
import numpy as np

# 给每行添加所属分组的分位数
vol1['q90'] = vol1.groupby('group')['TTQDN'].transform(lambda x: x.quantile(0.9))
vol1['q75'] = vol1.groupby('group')['TTQDN'].transform(lambda x: x.quantile(0.75))

# 生成分类
vol1['Ranking'] = np.select(
    [vol1['TTQDN'] > vol1['q90'],
     (vol1['TTQDN'] > vol1['q75']) & (vol1['TTQDN'] <= vol1['q90'])],
    [1, 2],
    default=3
)

# 清理临时列
vol1.drop(['q75', 'q90'], axis=1, inplace=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:15:02