【问题标题】:groupby().mean() don't work under for loopgroupby().mean() 在 for 循环下不起作用
【发布时间】:2019-04-02 11:08:31
【问题描述】:

我有一个名为 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


【解决方案1】:

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

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]) 

【讨论】:

  • 你好 calvin,我实际上不想打印结果,我想将 groupby().mean() 应用于数据帧,我也不知道为什么它也会失败,groupby ().mean() 没有给出它应该在 for 循环下给出的结果,但是当我在单个数据帧上运行它或将结果分配给一个新的数据帧时它可以工作。
  • #anash:您不必打印结果,我编辑了不打印但更新的答案。最后,为了检查结果,我正在打印字典数据框!谢谢!
  • 您好 Calvin,感谢您的回答,我可以更新数据帧并在 for 循环下获得想要的结果,而无需将结果分配给另一个数据帧,解决问题的是 ['values'] 列我没有在我的代码中添加 c[i].groupby(['year','month']).mean().reset_index() ,谢谢。
【解决方案2】:

请检查年、月组合是否在不同的数据框中重复,这可能是重复的原因。

在您的场景中,为另一个数据帧中的每个数据帧收集 groupby.mean 结果并在新数据帧上再次执行 groupby 平均值可能是个好主意

【讨论】:

  • 您好 mvinayakam,感谢您的回答。我将 groupby().mean 结果分配给另一个数据框并且它起作用了。
【解决方案3】:

您可以尝试以下方法吗:

main_df = pd.DataFrame()
for i in range(22): 
    main_df  = pd.concat([main_df, c[i].groupby(['year','month']).mean().reset_index()])
print(main_df.groupby(['year','month']).mean())

【讨论】:

  • 杰瑞尔您好,感谢您的回复。我尝试了代码,它给了我以下错误:TypeError: first argument must be an iterable of pandas objects, you pass a object of type "DataFrame"
  • 有一个错字,你现在可以检查一下
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 2013-12-31
  • 2018-04-22
  • 2016-05-13
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多