如何基于DataFrame标识列汇总BasePay并对比警消部门平均薪资
警察与消防部门BasePay平均值对比实现方法
现有数据集结构
数据集包含以下列:
Index(['Id', 'EmployeeName', 'JobTitle', 'BasePay', 'OvertimePay', 'OtherPay', 'Benefits', 'TotalPay', 'TotalPayBenefits', 'Year', 'Notes', 'Agency', 'Status'], dtype='object')
预处理:标记警察/消防职位
已经通过以下代码创建了isPolice和isFire布尔列,标记职位是否属于对应部门:
def find_police(x): return "POLICE" in x def find_fire(x): return 'FIRE' in x # 用apply在JobTitle中匹配 sf_sal["isPolice"] = sf_sal["JobTitle"].apply(find_police) sf_sal["isFire"] = sf_sal["JobTitle"].apply(find_fire) # 查看结果 sf_sal[["JobTitle", "isPolice", "isFire"]]
掩码筛选法的修正
你之前尝试的掩码筛选法有个小错误:计算消防部门平均BasePay时,分母误用了ratio_of_police,应该换成ratio_of_fire。修正后的代码如下:
# 统计两类职位的人数 count_police = sf_sal["isPolice"].sum() count_fire = sf_sal["isFire"].sum() # 计算警察部门平均BasePay police_mask = sf_sal['isPolice'] == True police_base_sum = sf_sal[police_mask]['BasePay'].sum() print(police_base_sum / count_police) # 计算消防部门平均BasePay fire_mask = sf_sal['isFire'] == True fire_base_sum = sf_sal[fire_mask]['BasePay'].sum() print(fire_base_sum / count_fire)
groupby简洁实现方法
用groupby可以更高效地完成对比,推荐两种方式:
方式1:创建统一的部门列后分组
先新增一列标记员工所属部门(非警察/消防的标记为其他),再按部门分组计算平均BasePay:
# 新增部门列 sf_sal['Department'] = sf_sal.apply(lambda row: 'Police' if row['isPolice'] else ('Fire' if row['isFire'] else 'Other'), axis=1) # 分组计算平均BasePay dept_avg_basepay = sf_sal.groupby('Department')['BasePay'].mean() # 仅查看警察和消防的结果 print(dept_avg_basepay[['Police', 'Fire']])
方式2:直接基于布尔列分组
如果只想对比警察和消防,也可以直接对两个布尔列分别计算均值,或者构造分组条件:
# 方法A:分别计算 police_avg = sf_sal[sf_sal['isPolice']]['BasePay'].mean() fire_avg = sf_sal[sf_sal['isFire']]['BasePay'].mean() print(f"警察部门平均BasePay: {police_avg}") print(f"消防部门平均BasePay: {fire_avg}") # 方法B:用groupby一次性计算 # 先构造分组键:把isPolice和isFire转换成可分组的标签 sf_sal['Group'] = sf_sal.apply(lambda x: 'Police' if x['isPolice'] else 'Fire' if x['isFire'] else None, axis=1) # 过滤掉非警察/消防的行,再分组求均值 result = sf_sal.dropna(subset=['Group']).groupby('Group')['BasePay'].mean() print(result)
内容的提问来源于stack exchange,提问作者Darman
相关产品推荐
相关产品推荐

