You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas DataFrame计算月度数据的年度均值并生成每年一行的数据集

问题描述

我有一个包含1990年1月1日至2022年12月1日月度数据的数据集,共396行5列,数据结构如下:

time        KW       KWB      KWNB    KW_Wan
0   1990-01-01  6.202622  4.703502  1.364310  1.094818
1   1990-02-01  5.496127  4.105197  1.315037  0.994010
2   1990-03-01  5.709514  4.271940  1.337316  0.962968
3   1990-04-01  5.462525  4.046974  1.304561  0.892898
4   1990-05-01  5.962263  4.497025  1.317582  0.978504
..         ...       ...       ...       ...       ...
391 2022-08-01  6.344508  4.833736  1.342924  1.024887
392 2022-09-01  6.186552  4.686499  1.358012  0.975839
393 2022-10-01  5.886825  4.411931  1.343506  1.000438
394 2022-11-01  5.511992  4.101947  1.303725  0.962535
395 2022-12-01  5.858962  4.398572  1.364262  0.987936

我希望计算每列的年度均值,最终得到一个32行5列的DataFrame。我尝试了以下代码:

year=pd.Series(range(1990,2023))
a_kw=monthlymean_kw.groupby(monthlymean_kw.time.dt.year)['KW'].transform('mean')
a_kwb=monthlymean_kw.groupby(monthlymean_kw.time.dt.year)['KWB'].transform('mean')
akwnb=monthlymean_kw.groupby(monthlymean_kw.time.dt.year)['KWNB'].transform('mean')
a_kwWan=monthlymean_kw.groupby(monthlymean_kw.time.dt.year)['KW_Wan'].transform('mean')

annualmean=pd.DataFrame({'year':list(year),'KW':list(a_kw),'KWB':list(a_kwb),'KWNB':list(akwnb),'KW_Wan':list(a_kwWan)},columns=['Year','KW','KWB','KWNB','KW_Wan'])

代码可以运行,但得到的是一个396行5列的DataFrame,每行的值为该记录对应年份的均值。请问如何生成每年仅包含一个均值的年度均值DataFrame?

解决方案

你使用transform方法的问题在于,它会将计算出的年度均值广播到原数据集的每一行,因此结果行数和原数据一致。要直接得到每年一行的聚合结果,只需要将transform替换为mean(),并通过一次分组操作完成所有列的聚合,无需单独处理每一列:

方法1:聚合所有数值列

# 按time列的年份分组,对所有数值列计算年度均值
annual_mean = monthlymean_kw.groupby(monthlymean_kw['time'].dt.year).mean().reset_index()
# 将年份列重命名为Year
annual_mean = annual_mean.rename(columns={'time': 'Year'})

方法2:聚合指定列(可选)

如果只需要对特定列计算年度均值,可以明确指定列名:

# 指定需要计算均值的列
target_cols = ['KW', 'KWB', 'KWNB', 'KW_Wan']
# 分组并聚合指定列
annual_mean = monthlymean_kw.groupby(monthlymean_kw['time'].dt.year)[target_cols].mean().reset_index()
# 重命名年份列
annual_mean = annual_mean.rename(columns={'time': 'Year'})

以上两种方法得到的annual_mean都是32行5列的DataFrame,每行对应一个年份的各列均值。

内容的提问来源于stack exchange,提问作者Shayma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:40:37