如何使用Pandas找出各项目中营收最高的员工(展示姓名及营收)
用Pandas找出每个项目营收最高员工的实现方案
嘿,这个需求在Pandas里有好几种实用的实现方式,我给你整理几个常用方案,附代码和详细解释,你可以根据自己的场景选择:
第一步:构造示例数据集
首先我们把你提供的数据转换成Pandas DataFrame:
import pandas as pd # 构造你的示例数据 data = { 'Rev': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'], 'Project': ['dave', 'Ron', 'Lily', 'Maya', 'Jon', 'Alex', 'Allen', 'Ji', 'Shan'], 'Emp': [5000, 21000, 12000, 15000, 34000, 31000, 18000, 10000, 28000] } df = pd.DataFrame(data)
方法1:groupby + idxmax(最直接高效)
这个方法是最常用的,核心思路是按项目(Rev)分组,找到每组中营收(Emp)最大值对应的行索引,再提取这些行:
# 找到每个Rev组内Emp最大值的行索引,提取对应行 max_emp_per_rev = df.loc[df.groupby('Rev')['Emp'].idxmax()] # 可选:调整列顺序让结果更贴合需求 max_emp_per_rev = max_emp_per_rev[['Rev', 'Project', 'Emp']] print(max_emp_per_rev)
解释:df.groupby('Rev')['Emp'].idxmax()会返回每个Rev分组里Emp值最大的那一行的索引,再通过loc定位这些行,就能直接得到目标结果。
方法2:排序后去重(直观易懂)
先按项目分组,再按营收降序排序,最后保留每个项目的第一条记录:
# 按Rev升序、Emp降序排序,保留每个Rev的第一条数据 max_emp_per_rev = df.sort_values(['Rev', 'Emp'], ascending=[True, False]).drop_duplicates('Rev') # 可选:重置索引让结果更整洁 max_emp_per_rev = max_emp_per_rev[['Rev', 'Project', 'Emp']].reset_index(drop=True) print(max_emp_per_rev)
解释:排序后每个Rev分组的第一行就是营收最高的员工,drop_duplicates('Rev')会自动保留每个Rev的第一条记录,实现筛选目的。
方法3:transform标记筛选(支持多最大值场景)
如果某个项目有多个员工营收相同且都是最大值,这个方法会把所有符合条件的记录都保留下来:
# 给每行标记是否是所在Rev组的Emp最大值 df['is_max'] = df.groupby('Rev')['Emp'].transform(lambda x: x == x.max()) # 筛选出标记为True的行,去掉辅助列 max_emp_per_rev = df[df['is_max']].drop('is_max', axis=1) print(max_emp_per_rev)
解释:transform会对每个分组的所有行执行判断,标记该行是否为分组内的最大值,之后筛选标记为True的行即可。
最终输出示例
不管用哪种方法,最终输出结果都会是:
Rev Project Emp 1 A Ron 21000 4 B Jon 34000 8 C Shan 28000
内容的提问来源于stack exchange,提问作者Rashida
相关产品推荐
相关产品推荐

