如何为DataFrame生成目标百分比列并保留计数列
解决方案
你的问题出在计算百分比时的分组维度错误——你按Attrition、Gender、JobSatisfaction三个字段分组,导致每个小组的总和就是自身的count,所以百分比全为100%。正确的做法是按Attrition和Gender分组,计算每个JobSatisfaction在对应分组内的占比。
修正后的代码如下:
# 筛选需要的列(注意列名拼写:原DataFrame是JobSatisfaction,不是Job_Satisfaction) df1 = df[['Attrition', 'Gender', 'JobSatisfaction']] # 分组统计各JobSatisfaction的计数 df1 = df1.groupby(['Attrition', 'Gender'])['JobSatisfaction'].value_counts().reset_index(name='count') # 按Attrition+Gender分组计算总计数,再求占比 df1['%'] = 100 * df1['count'] / df1.groupby(['Attrition', 'Gender'])['count'].transform('sum') # 格式化百分比,保留两位小数(可选,让结果更清晰) df1['%'] = df1['%'].round(2) # 按指定字段排序 df1 = df1.sort_values(by=['Gender', 'Attrition', 'JobSatisfaction']) df1
关键修正点:
- 修正列名拼写错误:原代码中
Job_Satisfaction是笔误,对应原DataFrame的JobSatisfaction - 调整百分比计算的分组维度:改为按
['Attrition','Gender']分组,transform('sum')会得到每个性别+离职状态组合的总人数,用当前行的count除以这个总和,就能得到该JobSatisfaction在对应分组内的占比 - 可选的
round(2)可以让百分比保留两位小数,和你期望的结果格式一致
内容的提问来源于stack exchange,提问作者WF30
相关产品推荐
相关产品推荐

