2015-02-12 3 views
0

У меня есть панд объект DataFrame, который выглядит примерно так:Группы по категориям выпуска панды объекта DataFrame в словарь объекта

In [106]: df 
    Out [106]: df[ 
        Amount  Category   
      date 
    2014-08-05  18.40  Thing01 
    2014-08-05  192.60  Thing01 
    2014-08-05  10.42  Thing02 
    2014-08-05  13.34  Thing07 
    2014-08-05  364.56  Thing04 
    2014-08-05  843.21  Thing03 
    2014-08-04  14.65  Thing04 
    2014-08-04  56.98  Thing11 
    2014-08-04  76.21  Thing99 
    2014-08-04  786.22  Thing99 
    2014-08-04  87.44  Thing99 
    2014-08-04  53.23  Thing01 
    2014-08-04  32.12  Thing99 
    ] 

Я хочу, чтобы сгруппировать эти данные по «Категории» и использовать результат для создания словарь Python, который выглядит примерно так:

In [107]: OutInfo 
Out [107]: OutInfo = { 

    Thing01: 
          Amount 
       date    
      2014-08-05  18.40 
      2014-08-05  192.60 
      2014-08-04  53.23 

    Thing02: 
          Amount 
       date  
      2014-08-05  10.42 

    Thing07: 
          Amount 
       date 
      2014-08-05  13.34 

    Thing04: 
          Amount 
       date 
      2014-08-05  364.56 
      2014-08-04  14.65 

    Thing03: 
          Amount 
       date 
      2014-08-05  843.21 

    Thing11: 
          Amount 
       date 
      2014-08-04  56.98 

    Thing99: 
          Amount 
       date 
      2014-08-04  76.21 
      2014-08-04  786.22 
      2014-08-04  87.44 
} 

Я попытался с помощью команд, как: df.groupby («Категория») с различными функциями в конце включая .Не метод (который я не в полной мере понять или...). Я пробовал другие методы, но тот факт, что у меня несколько записей за один день, помешало мне использовать их. Заранее благодарю за любую помощь!

-Jeremy

+0

Я стараюсь избегать использования петель. У меня уже есть решение, которое использует петли for for, но это SLOW. – aacealo

ответ

0

groupby является правильная идея. Для того, чтобы получить именно то, что вы хотите, вы могли бы сделать что-то вроде

>>> d = {k: v.drop("Category", axis=1) for k,v in list(df.groupby("Category"))} 
>>> pprint.pprint(d) 
{'Thing01':    Amount 
date    
2014-08-05 18.40 
2014-08-05 192.60 
2014-08-04 53.23, 
[...] 
'Thing99':    Amount 
date    
2014-08-04 76.21 
2014-08-04 786.22 
2014-08-04 87.44 
2014-08-04 32.12} 

Если вы звоните list на groupby объекта, вы получите список групп ключ/значение кортежей. Если вы вызываете dict(list(grouped)), это становится словарем. Обычно, однако, вы не удаляете столбец ключей, как в вашем примере, нужный результат. Поэтому, если вы хотите сохранить дополнительную колонку, это еще проще:

>>> d = dict(list(df.groupby("Category"))) 
>>> d["Thing01"] 
      Amount Category 
date      
2014-08-05 18.40 Thing01 
2014-08-05 192.60 Thing01 
2014-08-04 53.23 Thing01 
+0

Нет необходимости конвертировать в список. Просто перебирайте объект groupby d = {k: v.drop («Категория», ось = 1) для k, v в df.groupby («Категория»)} ' – awhan

+0

Я пошел с dict (list (df. groupby («Категория»))). Он сбрил полную секунду с цикла «за», который я использовал. Благодаря! – aacealo

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