如何用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
相关产品推荐
相关产品推荐

