Как сгруппировать ключи в словаре и суммировать значения в python? - PullRequest
0 голосов
/ 08 июня 2019

Как groupby два keys в dictionary и получить сумму значений другого ключа val.

Input:

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

ВВ этом примере я хочу groupby key1 и 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'])

И результат отображается следующим образом:

  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

1 Ответ

1 голос
/ 08 июня 2019

Вы можете создать свое собственное решение суммирования, используя 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]}

Сказав, что, однако, кажется, что ваши данные больше подходят для табличных структур, и если вы планируете делать больше, чем просто эту одну операцию, возможно, в любом случае имеет смысл загрузить их в фрейм данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...