如何对字典中的键进行分组并汇总python中的值?

时间:2019-06-08 08:54:07

标签: python dictionary pandas-groupby

如何在groupbykeys两个dictionary并获得另一个键val的值的总和。

Input:

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

在此示例中,我要groupbykey1,然后对key2中的值求和。

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

1 个答案:

答案 0 :(得分:1)

您可以使用defaultdict构建自己的求和解决方案,如下所述。

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

但是,看来您的数据似乎更适合表格结构,并且,如果您打算做的不仅仅是这项操作,那么无论如何都应该将其加载到数据框中。