如何在Pandas中通过groupby按部门对Rank字段创建分箱?
问题
我有一个包含name、dept、Rank字段的DataFrame,希望按dept分组,对每个部门的Rank字段创建分箱,生成对应Good、Avg、Poor的Comment列。目前我已通过逐个筛选部门调用pd.qcut实现该功能,但想了解如何使用groupby方法完成此操作。
原始数据:
name dept Rank "A" "ENG" 1 "A" "MGMT" 1 "B" "ENG" 2 "C" "MGMT" 2 "D" "MGMT" 3 "E" "ENG" 3
期望结果:
name dept Rank Comment "A" "ENG" 1 Good "A" "MGMT" 1 Good "B" "ENG" 2 Avg "C" "MGMT" 2 Avg "D" "MGMT" 3 Poor "E" "ENG" 3 Poor
当前实现代码:
df['Comment'] = pd.qcut(df[df['dept'] == "ENG"]['Rank'], q=[0.0, .25, .5, 1.0], labels=['Good', 'Avg', 'Poor']) df['Comment'] = pd.qcut(df[df['dept'] == "MGMT"]['Rank'], q=[0.0, .25, .5, 1.0], labels=['Good', 'Avg', 'Poor'])
解决方案
可以通过groupby('dept')对数据按部门分组,再用apply为每个分组单独执行pd.qcut分箱逻辑,最后将结果合并回原DataFrame:
import pandas as pd # 构造原始数据 data = [ ("A", "ENG", 1), ("A", "MGMT", 1), ("B", "ENG", 2), ("C", "MGMT", 2), ("D", "MGMT", 3), ("E", "ENG", 3) ] df = pd.DataFrame(data, columns=['name', 'dept', 'Rank']) # 使用groupby + apply实现分组分箱 df['Comment'] = df.groupby('dept')['Rank'].apply( lambda x: pd.qcut(x, q=[0.0, 0.25, 0.5, 1.0], labels=['Good', 'Avg', 'Poor']) ) print(df)
代码说明
groupby('dept')['Rank']:按部门分组,仅保留Rank列进行后续分箱处理lambda x: pd.qcut(...):对每个部门的Rank数据执行分箱,指定分位数区间和对应标签- 执行后结果会自动按原数据索引匹配,直接赋值给
Comment列即可得到目标结果
执行上述代码后,输出结果与期望一致:
name dept Rank Comment 0 A ENG 1 Good 1 A MGMT 1 Good 2 B ENG 2 Avg 3 C MGMT 2 Avg 4 D MGMT 3 Poor 5 E ENG 3 Poor
内容的提问来源于stack exchange,提问作者ggupta
相关产品推荐
相关产品推荐

