You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动