2015-12-03 2 views
1

Предположим, у меня есть такая dataframe:Python dataframe словарь агрегация слияния с суммой не удалось

da1 = DataFrame({'id':['bub','char', 'bub'], 
       'a':[{'t1':1,'t2':3}, 
         {'t1':3}, 
         {'t2':1}]}) 
print da1 
         a id 
0 {u't2': 3, u't1': 1} bub 
1   {u't1': 3} char 
2   {u't2': 1} bub 

Я хочу просуммировать содержимое столбца «а» по ключу, группировка по «ид», что я попытался было:

print da1.groupby('id')\ 
     .aggregate({ 
      'a': lambda x: DataFrame.from_dict(x).sum().to_dict()}) 
id             a 
bub <built-in method values of dict object at 0x7f... 
char <built-in method values of dict object at 0x7f... 

Но если я сделать последующие:

bub = [{'t1':1,'t2':3}, {'t2':1}] 
print DataFrame.from_dict(bub).sum().to_dict() 
{'t2': 4.0, 't1': 1.0} 

я получаю то, что я хотел в первый раз, что мне не хватает?

UPD: Я также попытался с помощью счетчика(), без успеха ...

from collections import Counter 
print dict(sum((Counter(dict(x)) for x in bub),Counter())) 
{'t2': 4, 't1': 1} 

print da1.groupby('id')\ 
      .aggregate({ 
       'a': lambda dic: dict(sum((Counter(dict(x)) for x in dic),Counter()))}) 
id             a 
bub <built-in method values of dict object at 0x7f... 
char <built-in method values of dict object at 0x7f... 
+0

Я сомневаюсь, что ваш первый DataFrame, da1, является тем, что вы хотите: столбец с dicts для значений обычно не является чем-то, что вы помещаете в dataframe. – Evert

+0

Вы правы! Я действительно использую очень похожую структуру для вставки такого поля в базу данных. – dtj

ответ

0

я нашел способ решить эту проблему, может быть очень неэффективной, но он работал на меня.

Я нашел issue об ошибке при использовании метода apply и исправлена ​​ошибка. Поскольку они исправлены для применения, я использовал функцию apply, чтобы делать то, что хочу.

print DataFrame({'visitorId':da1.groupby('id', as_index=False).groups.keys(), 
      'a':da1.groupby('id', as_index=False)\ 
         .apply(lambda dic: 
           dict(sum((Counter(dict(x)) for x in dic.a), 
              Counter())))}) 

         a visitorId 
0 {u't2': 4, u't1': 1}  bub 
1   {u't1': 3}  char 

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

Смежные вопросы