如何在Pandas中筛选出薪资高于所在部门平均薪资的员工记录
报错原因
你的推测是正确的,groupby.filter的设计逻辑是判断整个分组是否需要保留,要求传入的回调函数返回单个布尔值,你在lambda里返回了和整个原表长度一致的布尔序列,同时还调用了全局的df['salary'],和当前分组的维度不匹配,因此触发类型错误。
正确实现方案
最贴合你SQL查询逻辑的写法是使用transform实现分组聚合结果的行级广播:
# 计算每个部门的平均薪资,结果会映射回原表的每一行 dept_avg = df.groupby('Department')['Salary'].transform('mean') # 用布尔索引筛选符合条件的员工,取需要的字段 res = df[df['Salary'] > dept_avg][['Name', 'Department', 'Salary']]
如果想要用分组处理的写法,也可以用groupby.apply实现:
res = df.groupby('Department', group_keys=False).apply( lambda group: group[group['Salary'] > group['Salary'].mean()] )[['Name', 'Department', 'Salary']]
两种写法的执行结果完全一致,和你给出的SQL语句逻辑等价。
内容的提问来源于stack exchange,提问作者user17144629
相关产品推荐
相关产品推荐

