首页 > 解决方案 > groupby().mean() 在 for 循环下不起作用

问题描述

我有一个名为 c 的字典,其中对象作为数据框,每个数据框有 3 列: 'year' 'month' & 'Tmed' ,我想计算 Tmed 每年的月平均值,我用

for i in range(22) : c[i].groupby(['year','month']).mean().reset_index() 

这返回

  year   month  Tmed
0 2018   12     14.8
2 2018   12     12.0
3 2018   11     16.1
5 2018   11     9.8
6 2018   11     9.8
9 2018   11     9.3

4425 rows × 3 columns

索引不是应有的,例如,对于 2018 年的第 11 个月,应该只有一行,但如您所见,数据框不止一行。

我在单个数据帧上尝试了代码,它给出了想要的结果:

c[3].groupby(['year','month']).mean().reset_index()

     year   month   Tmed
0    1999     9    23.950000
1    1999    10    19.800000
2    1999    11    12.676000
3    1999    12    11.012000
4    2000     1     9.114286
5    2000     2    12.442308
6    2000     3    13.403704
7    2000     4    13.803846
8    2000     5    17.820000
.        
.
.
218  2018     6    21.093103
219  2018     7    24.977419
220  2018     8    26.393103
221  2018     9    24.263333
222  2018    10    19.069565
223  2018    11    13.444444
224  2018    12    13.400000

225 rows × 3 columns

我需要放 for 循环,因为我有很多数据框,我无法解决问题,任何帮助将不胜感激。

标签: python

解决方案


我看不出您的代码应该失败的原因。我在下面尝试并得到了所需的结果:

import numpy as np
import pandas as pd
def getRandomDataframe():
    rand_year = pd.DataFrame(np.random.randint(2010, 2011,size=(50, 1)), columns=list('y'))
    rand_month = pd.DataFrame(np.random.randint(1, 13,size=(50, 1)), columns=list('m'))
    rand_value = pd.DataFrame(np.random.randint(0, 100,size=(50, 1)), columns=list('v'))
    df = pd.DataFrame(columns=['year', 'month', 'value'])
    df['year'] = rand_year
    df['month'] = rand_month
    df['value'] = rand_value

    return df


def createDataFrameDictionary():
    _dict = {}
    length = 3

    for i in range(length):
        _dict[i] = getRandomDataframe()

    return _dict

c = createDataFrameDictionary()

for i in range(3):
    c[i] = c[i].groupby(['year','month'])['value'].mean().reset_index()


# Check results
print(c[0]) 

推荐阅读