【问题标题】:How to groupby the keys in dictionary and sum up the values in python?如何按字典中的键分组并总结python中的值?
【发布时间】:2019-06-08 08:54:07
【问题描述】:

如何在dictionarygroupby两个keys得到另一个键val的值之和。

Input:

data = {'key1':['a','a', 'b', 'b'], 'key2':['m','n', 'm', 'm'], 
        'val':[1, 2, 3, 4]}

在这个例子中,我想将groupbykey1key2,然后将val中的值相加。

Expected:

data = {'key1':['a','a', 'b', 'b'], 'key2':['m','n', 'm', 'm'], 
        'val':[1, 2, 3, 4], 'val_sum':[1, 2, 7, 7]}

其实我并不想把字典data转成pandas.DataFrame再转回dictionary来实现,因为我的data其实很大。


更新:

为了帮助理解生成val_sum,我使用pandas.DataFrame 发布我的代码。

df = pd.DataFrame(data)
tmp = df.groupby(['key1', 'key2'])['val'].agg({'val_sum':'sum'})
df['val_sum'] = df.set_index(['key1', 'key2']).index.map(tmp.to_dict()['val_sum'])

结果如下:

  key1 key2  val  val_sum
0    a    m    1        1
1    a    n    2        2
2    b    m    3        7
3    b    m    4        7

【问题讨论】:

    标签: python dictionary pandas-groupby


    【解决方案1】:

    您可以使用默认字典构建自己的求和解决方案,如下所示。

    from collections import defaultdict
    
    data = {'key1':['a','a', 'b', 'b'], 'key2':['m','n', 'm', 'm'], 
            'val':[1, 2, 3, 4]}
    
    
    keys_to_group = ['key1','key2']
    
    temp = defaultdict(int) #initializes sum to zero
    
    
    for i, *key_group in zip(data['val'], *[data[key] for key in keys_to_group]):
        print(i, key_group) #key_group now looks like ['a', 'm'] or ['b', 'm'] or so on
        temp[tuple(key_group)] += i
    
    val_sum = [temp[key_group] for key_group in zip(*[data[key] for key in keys_to_group])]
    
    data['val_sum'] = val_sum
    
    print(data)
    {'key1': ['a', 'a', 'b', 'b'],
     'key2': ['m', 'n', 'm', 'm'],
     'val': [1, 2, 3, 4],
     'val_sum': [1, 2, 7, 7]}
    

    话虽如此,您的数据似乎更适合表格结构,如果您打算做的不仅仅是这一操作,那么无论如何将其加载到数据框中可能是有意义的。

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2019-06-29
      • 1970-01-01
      • 2021-10-17
      • 2023-01-19
      • 1970-01-01
      相关资源
      最近更新 更多