Python 分组并计算元组列表中的平均值

Python 分组并计算元组列表中的平均值,python,Python,我有一个元组列表,如下所示: x=[('HSBC8999', 4, 179447), ('HSBC1199', 81, 864108), ('HSBC1199', 32, 715121),('HSBC8999', 4, 1447),('HSBC1199', 32, 61521) ] 我想执行几个任务: 根据第一项对列表进行分组:HSBCXXXX 在每组中,计算列表中具有相同第二项的第三项的平均值 大概是这样的: 第一组: 4的平均值:(179447+1447)/2 第2组: ('HSBC119

我有一个元组列表,如下所示:

x=[('HSBC8999', 4, 179447), ('HSBC1199', 81, 864108), ('HSBC1199', 32, 715121),('HSBC8999', 4, 1447),('HSBC1199', 32, 61521) ]
我想执行几个任务:

  • 根据第一项对列表进行分组:HSBCXXXX

  • 在每组中,计算列表中具有相同第二项的第三项的平均值

  • 大概是这样的: 第一组:

    4的平均值:(179447+1447)/2

    第2组:

    ('HSBC1199', 81, 864108)
    ('HSBC1199', 32, 715121)
    ('HSBC1199', 32, 61521)
    
    平均值为81:864108


    使用带浮点的嵌套defaultdict对32=(715121+61521)/2的平均值

    from collections import defaultdict
    
    l = [('A1', 'A', 342.5), ('A2', 'A', 509.70), ('A2', 'B', 119.34),
         ('A1', 'B', 618.42), ('A1', 'A', 173.54), ('A1', 'B', 235.21)]
    
    d = defaultdict(lambda: defaultdict(lambda: defaultdict(float)))
    
    for a,b,c in l:
        d[a][b]['sum'] += c
        d[a][b]['count'] += 1
        d[a][b]['average'] += (c - d[a][b]['average'])/d[a][b]['count']
    
    我们使用的事实是,平均值可以计算为(见:)

    返回以下结构:

    {
      "A1": {
        "A": {
          "sum": 516.04,
          "count": 2.0,
          "average": 258.02
        },
        "B": {
          "sum": 853.63,
          "count": 2.0,
          "average": 426.815
        }
      },
      "A2": {
        "A": {
          "sum": 509.7,
          "count": 1.0,
          "average": 509.7
        },
        "B": {
          "sum": 119.34,
          "count": 1.0,
          "average": 119.34
        }
      }
    }
    
    也许会有帮助。请先读一下
    from collections import defaultdict
    
    l = [('A1', 'A', 342.5), ('A2', 'A', 509.70), ('A2', 'B', 119.34),
         ('A1', 'B', 618.42), ('A1', 'A', 173.54), ('A1', 'B', 235.21)]
    
    d = defaultdict(lambda: defaultdict(lambda: defaultdict(float)))
    
    for a,b,c in l:
        d[a][b]['sum'] += c
        d[a][b]['count'] += 1
        d[a][b]['average'] += (c - d[a][b]['average'])/d[a][b]['count']
    
    {
      "A1": {
        "A": {
          "sum": 516.04,
          "count": 2.0,
          "average": 258.02
        },
        "B": {
          "sum": 853.63,
          "count": 2.0,
          "average": 426.815
        }
      },
      "A2": {
        "A": {
          "sum": 509.7,
          "count": 1.0,
          "average": 509.7
        },
        "B": {
          "sum": 119.34,
          "count": 1.0,
          "average": 119.34
        }
      }
    }