Pandas按State、Trimester分组生成Tax三分位类别列的实现方法问询
实现方法
直接结合groupby.transform与pd.qcut即可完成需求,核心逻辑如下:
最简实现代码
import pandas as pd # 定义三分位对应标签 q_labels = ['L', 'M', 'H'] df['Tax_per_state_per_trimester'] = df.groupby(['State', 'Trimester'])['Tax'].transform( lambda ser: pd.qcut(ser, q=3, labels=q_labels, duplicates='drop') )
参数说明
pd.qcut是pandas专门用于按分位数切分数据的内置函数,q=3表示直接将数据切为三等份的三分位labels参数指定三个分位区间从低到高对应的标签,和需求的L/M/H直接匹配duplicates='drop'用于处理子组内Tax值大量重复导致分位数切点重合的报错场景,若你的数据每个分组样本量充足且Tax值离散度高可省略该参数- 用
transform而非apply的优势是返回结果会自动和原DataFrame的索引对齐,无需额外做拼接操作
小样本分组兼容优化
如果存在部分State+Trimester分组的样本量小于3、无法正常切分三分位的场景,可以自定义处理逻辑:
def tax_qcut(ser): # 样本量不足3条时返回空值,也可根据需求自定义默认标签 if len(ser) < 3: return pd.Series([pd.NA]*len(ser), index=ser.index) return pd.qcut(ser, q=3, labels=['L', 'M', 'H'], duplicates='drop') df['Tax_per_state_per_trimester'] = df.groupby(['State', 'Trimester'])['Tax'].transform(tax_qcut) # 可选:将结果列显式设置为分类类型 df['Tax_per_state_per_trimester'] = df['Tax_per_state_per_trimester'].astype('category')
内容的提问来源于stack exchange,提问作者dov1000
相关产品推荐
相关产品推荐

