Как получить серию json / словарей из pandas Dataframe groupby object - PullRequest
1 голос
/ 09 октября 2019

У меня есть Dataframe с более чем 2 столбцами (Col1, Col2 и т. Д.), И я хочу сгенерировать Серию, где индексом является Col1, а значения Серии являются словарями, где ключом является Col2 иvalue (of the dict) - вхождения кортежа (Col1, Col2).

Допустим, что кадр данных выглядит примерно так:

    Col1 Col2 Col3 ...
 0    A    b   ... 
 1    B    e   ... 
 2    A    a   ... 
 3    C    a   ... 
 4    A    b   ... 
 5    B    c   ... 
 6    A    e   ... 
 7    B    c   ... 

Требуемый вывод:

A {'a':1,'b':2,'e':1}
B {'c':2,'e':1}
C {'a':1}

Мне удалось это с помощью этого цикла:

for t in my_df['Col1'].unique(): 
  my_series.loc[t] = my_df[my_df['Col1'] == t].groupby('Col2').size().to_json()

, но мне было интересно, есть ли способ сделать это более эффективно с помощью методов панд, без итерации.

Я также пытался сгруппировать с двумя индексами:

   my_df.groupby(['Col1','Col2']).size() 
   >
   Col1  Col2
    A     a     1
          b     2
          e     1
    B     c     2
          e     1
    C     a     1

, но не могу найти следующий шаг, чтобы преобразовать результат в Series of dict, как показано выше

1 Ответ

0 голосов
/ 09 октября 2019

Дефект по умолчанию - это то, что вам нужно:

import collections

resul = collections.defaultdict(dict)
for row in my_df.groupby(['Col1','Col2']).size().iteritems():
    resul[row[0][0]][row[0][1]] = row[1]

pprint.pprint(resul)

дает, как и ожидалось:

defaultdict(<class 'dict'>,
            {'A': {'a': 1, 'b': 2, 'e': 1},
             'B': {'c': 2, 'e': 1},
             'C': {'a': 1}})

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

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