如何使用Pandas按年月分组计算就业人口占比并合并至原数据集
解决方案:计算年月维度的就业占比并添加到原数据集
嘿,我明白你的需求了!要给每个行添加对应年月的就业人口占比,其实有两种简洁高效的方法,比分开统计sum和size再合并要省事得多:
方法1:用transform一步到位(推荐)
transform方法可以直接在分组后计算统计量,并将结果自动广播到原数据集的每一行,完美匹配你的需求:
# 先筛选出2018-01到2020-04的数据(可选,但能减少计算量) df_filtered = df_CPS[(df_CPS['HRYEAR4'].between(2018, 2020)) & ((df_CPS['HRYEAR4'] == 2018) | (df_CPS['HRYEAR4'] == 2019) | (df_CPS['HRYEAR4'] == 2020) & (df_CPS['HRMONTH'] <= 4))] # 计算每个年月的就业占比并添加为新列PEMLR_PCT,保留1位小数 df_filtered['PEMLR_PCT'] = df_filtered.groupby(['HRYEAR4', 'HRMONTH'])['PEMLR_1'].transform( lambda x: (x.sum() / x.size) * 100 ).round(1) # 如果需要保留原数据集所有行(时间范围外的行PEMLR_PCT设为None),可以直接在原df上操作: df_CPS['PEMLR_PCT'] = df_CPS.groupby(['HRYEAR4', 'HRMONTH'])['PEMLR_1'].transform( lambda x: (x.sum() / x.size) * 100 if (x.name[0] >=2018 and (x.name[0] <2020 or (x.name[0]==2020 and x.name[1]<=4))) else None ).round(1)
为什么推荐这个方法?
- 不需要手动创建中间表再合并,代码更简洁
- 自动将分组统计的占比匹配到原数据的每一行,避免合并时的键错误
方法2:先计算占比表再合并(更直观)
如果你更喜欢分步操作,可以先计算每个年月的占比,再用merge将占比列合并回原数据集:
# 1. 按年月分组,同时计算就业人数和总人数,再算出占比 pct_df = df_CPS.groupby(['HRYEAR4', 'HRMONTH']).agg( emp_count=('PEMLR_1', 'sum'), total_count=('PEMLR_1', 'size') ).assign(PEMLR_PCT=lambda x: (x['emp_count'] / x['total_count']) * 100).round(1).reset_index() # 2. 筛选出2018-01到2020-04的占比数据 pct_filtered = pct_df[(pct_df['HRYEAR4'].between(2018,2020)) & ((pct_df['HRYEAR4'] ==2020) & (pct_df['HRMONTH'] <=4) | (pct_df['HRYEAR4'] <2020))] # 3. 合并回原数据集(左连接保留原数据所有行,时间范围外的PEMLR_PCT会显示NaN) df_CPS = df_CPS.merge(pct_filtered[['HRYEAR4', 'HRMONTH', 'PEMLR_PCT']], on=['HRYEAR4', 'HRMONTH'], how='left')
验证结果
运行代码后,你会得到和示例完全一致的数据集:每个年月的所有行都会对应相同的PEMLR_PCT值,比如2018年1月的所有行都显示90.1,2020年4月的所有行显示73.8。
内容的提问来源于stack exchange,提问作者Anna




