如何在Python Pandas中按分组取最高分数对应职位并新增列?
解决方案
你可以通过Pandas的分组操作实现这个需求,以下是两种简洁的实现方式:
方法一:使用groupby + idxmax + map
先定位每个分组中最高分对应的Job type,再映射到原DataFrame的每一行:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'person': ['person 1', 'person 1', 'person 2', 'person 2', 'person 2'], 'score': [6.5, 4.3, 1.2, 3.4, 4.3], 'Job type': ['job 1', 'job 2', 'job 1', 'job 2', 'job 3'] }) # 获取每个person对应的最高分Job type highest_job_map = df.loc[ df.groupby('person')['score'].idxmax(), ['person', 'Job type'] ].set_index('person')['Job type'] # 新增目标列 df['Highest score'] = df['person'].map(highest_job_map)
说明
df.groupby('person')['score'].idxmax()返回每个person分组中,score值最大的行索引- 通过
loc提取这些行的person和Job type,转换为以person为索引的Series,方便后续映射 - 最后用
map将每个person对应的最高Job type匹配到原DataFrame的所有行
方法二:使用sort_values + groupby.transform
先按分数降序排序,再取每个分组的第一个Job type并广播到组内所有行:
import pandas as pd df = pd.DataFrame({ 'person': ['person 1', 'person 1', 'person 2', 'person 2', 'person 2'], 'score': [6.5, 4.3, 1.2, 3.4, 4.3], 'Job type': ['job 1', 'job 2', 'job 1', 'job 2', 'job 3'] }) # 按分数降序排序,分组后取每组第一个Job type并广播 df['Highest score'] = df.sort_values('score', ascending=False)\ .groupby('person')['Job type']\ .transform('first')
说明
sort_values('score', ascending=False)把每个person的行按分数从高到低排序groupby('person')['Job type'].transform('first')将每个分组的第一个Job type(即最高分对应的)填充到该组的所有行中
最终结果
两种方法都会得到你期望的输出:
| person | score | Job type | Highest score |
|---|---|---|---|
| person 1 | 6.5 | job 1 | job 1 |
| person 1 | 4.3 | job 2 | job 1 |
| person 2 | 1.2 | job 1 | job 3 |
| person 2 | 3.4 | job 2 | job 3 |
| person 2 | 4.3 | job 3 | job 3 |
注:如果同一个person存在多个相同的最高分,上述方法会取最先出现的那个
Job type;若需处理这种情况,可以根据需求调整逻辑(比如取所有符合条件的Job type用逗号分隔)
内容的提问来源于stack exchange,提问作者Helene Hjort
相关产品推荐
相关产品推荐

