Python字典的总和和平均值

时间:2018-09-05 10:33:57

标签: python arrays dictionary sum average

import os
from datetime import datetime, date
import datetime
test={datetime.date(1977, 6, 5): [81, 55, 0.0, False],
 datetime.date(2007, 11, 18): [45, 41, 0.02, True],
 datetime.date(2017, 11, 3): [43, 33, 0.3, True],
 datetime.date(2007, 2, 24): [44, 36, 0.36, True],
 datetime.date(2015, 2, 18): [54, 40, 0.0, False],
 datetime.date(2008, 11, 18): [51, 43, 0.01, True],
 datetime.date(1965, 12, 29): [43, 33, 0.27, True]}

sumtmax=0
year=[]
for k, v in test.items():
    year.append(k.year)
yearset=set(year)
print(yearset)

for i in yearset:
    for k, v in test.items():
        k=k.year
        if k==i:
            print(v[0])

我想获取每年的平均值[0]和平均值[3]。我该怎么办...

3 个答案:

答案 0 :(得分:2)

如果您正在使用此类数据,我绝对建议您使用pandas的表表示形式。

这里是一个例子:

import pandas as pd

df = pd.DataFrame(test).T.astype(float)

df.index = pd.to_datetime(df.index, format='%Y-%m-%d')

avg0 = df.groupby(df.index.year)[0].mean()

Out[60]: 
1965    43.0
1977    81.0
2007    44.5
2008    51.0
2015    54.0
2017    43.0
Name: 0, dtype: float64

sum3 = df.groupby(df.index.year)[3].sum()

sum3
Out[61]: 
1965    1.0
1977    0.0
2007    2.0
2008    1.0
2015    0.0
2017    1.0
Name: 3, dtype: float64

答案 1 :(得分:1)

您可以使用python内置的sum来按年获取值的总和,要获取平均值,只需将总和除以按年的条目数即可:

import os
from datetime import datetime, date
import datetime


test = {
   datetime.date(1977, 6, 5): [81, 55, 0.0, False],
   datetime.date(2007, 11, 18): [45, 41, 0.02, True],
   datetime.date(2017, 11, 3): [43, 33, 0.3, True],
   datetime.date(2007, 2, 24): [44, 36, 0.36, True],
   datetime.date(2015, 2, 18): [54, 40, 0.0, False],
   datetime.date(2008, 11, 18): [51, 43, 0.01, True],
   datetime.date(1965, 12, 29): [43, 33, 0.27, True]
}

yearset = set([k.year for k in test.keys()])

for i in yearset:
    print(sum([v[0] for k, v in test.items() if k.year == i]) / len(list(filter(lambda x: x.year == i, test.keys()))))
    print(sum([v[3] for k, v in test.items() if k.year == i]))

答案 2 :(得分:1)

这将为您提供dict形式的结果,而无需外部库:

sum3 = {}

for k, v in test.items():
    sum3[k.year] = sum3.get(k.year, 0) + v[3]

avg0 = {}

for k, v in test.items():
    value = avg0.get(k.year, (0, 0))
    avg0[k.year] = (value[0] + v[0], value[1] + 1.0)

avg0 = {k: v[0]/v[1] for k, v in avg0.items()}

sum3
#{2017: 1, 1965: 1, 2007: 2, 2008: 1, 1977: 0, 2015: 0}
avg0
#{2017: 43.0, 1965: 43.0, 2007: 44.5, 2008: 51.0, 1977: 81.0, 2015: 54.0}