【问题标题】:python dictionary sum and average by year每年的python字典总和和平均值
【发布时间】:2019-02-10 11:22:54
【问题描述】:
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])

我想获得每年 value[0] 的平均值和 value[3] 的总和。我该怎么做...

【问题讨论】:

    标签: python arrays dictionary sum average


    【解决方案1】:

    如果您正在处理此类数据,我绝对建议您使用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
    

    【讨论】:

    • 不是平均数和总和,我想要每年的结果......
    【解决方案2】:

    这将为您提供没有外部库的 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}
    

    【讨论】:

    • 嗨,zipa,你能解释一下这部分吗:for k, v in test.items(): value = avg0.get(k.year, (0, 0)) avg0[k.year ] = (值[0] + v[0], 值[1] + 1.0)
    • @KarenJiang 你似乎了解get() 的概念,所以我只是将默认值更改为(0, 0) 元组作为起点并为其添加新值以及将计数器增加一。 1.0 部分用于2.x 用户,否则您可以在 python 中使用1 3.x
    【解决方案3】:

    您可以使用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]))
    

    【讨论】:

    • 为什么不year = set()year.add()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    相关资源
    最近更新 更多