Pandas按年份聚合数值列,计算单行总和与均值的实现方法
问题描述
我有如下结构的DataFrame,希望按Year聚合所有数值列,计算这些列合并后的总和与均值。但使用mortality_wide.groupby('Year').agg(['mean', 'sum'])得到的结果是每个数值列单独的均值和总和,不符合需求,请问该如何实现?
DataFrame结构:
Year 01-04 Years 05-09 Years 10-14 Years 15-19 Years 0 1900 0.019838 0.004661 0.002983 0.004848 1 1901 0.016950 0.004276 0.002736 0.004544 2 1902 0.016557 0.004033 0.002525 0.004215 3 1903 0.015421 0.004147 0.002682 0.004341 4 1904 0.015915 0.004250 0.003052 0.004714 ... ... ... ... ... ... 114 2014 0.000240 0.000115 0.000140 0.000455 115 2015 0.000249 0.000117 0.000146 0.000483 116 2016 0.000253 0.000122 0.000146 0.000512 117 2017 0.000243 0.000116 0.000155 0.000515 118 2018 0.000240 0.000115 0.000149 0.000492 # 共119行 × 5列
当前代码运行结果(不符合需求):
01-04 Years 05-09 Years 10-14 Years 15-19 Years mean sum mean sum mean sum mean sum Year 1900 0.019838 0.019838 0.004661 0.004661 0.002983 0.002983 0.004848 0.004848 1901 0.016950 0.016950 0.004276 0.004276 0.002736 0.002736 0.004544 0.004544 ... ... ... ... ... ... ... ... ... 2018 0.000240 0.000240 0.000115 0.000115 0.000149 0.000149 0.000492 0.000492
解决方案
你需要先将宽格式DataFrame转换为长格式,把所有年龄组的数值合并到同一列后,再按Year聚合计算总和与均值,以下是两种可行方法:
方法1:使用melt转换格式
melt方法可以将指定列作为标识列,其余列转换为键值对形式:
# 转换为长格式:Year为标识列,其余列转为Age_Group和Mortality列 mortality_long = mortality_wide.melt( id_vars='Year', var_name='Age_Group', value_name='Mortality' ) # 按Year分组,计算合并后数值的总和与均值 result = mortality_long.groupby('Year')['Mortality'].agg(['sum', 'mean'])
方法2:使用stack转换格式
通过设置索引后堆叠列,也能实现宽转长:
# 将Year设为索引,堆叠所有数值列 mortality_stacked = mortality_wide.set_index('Year').stack().reset_index(name='Mortality') # 按Year聚合计算统计值 result = mortality_stacked.groupby('Year')['Mortality'].agg(['sum', 'mean'])
结果说明
转换后再聚合的结果会是每个Year对应一行,包含所有年龄组数值的总和(sum)与均值(mean),例如:
sum mean Year 1900 0.032330 0.008082 1901 0.028506 0.007126 ... ... ... 2018 0.000996 0.000249
内容的提问来源于stack exchange,提问作者Andrew Jones
相关产品推荐
相关产品推荐

