Простое кросс-табулирование в пандах - PullRequest
22 голосов
/ 06 марта 2012

Я наткнулся на панд , и это выглядит идеально для простых вычислений, которые я хотел бы сделать.У меня есть опыт работы в SAS, и я подумал, что он заменит proc freq - похоже, он будет масштабироваться до того, что я захочу сделать в будущем.Однако я просто не могу разобраться с простой задачей (я не уверен, должен ли я смотреть на pivot/crosstab/indexing - должен ли я иметь Panel или DataFrames и т. Д.)).Может ли кто-нибудь дать мне несколько советов о том, как сделать следующее:

У меня есть два файла CSV (один для 2010 года, один для 2011 года - простые данные транзакций) - столбцы категории и суммы

2010:

AB,100.00
AB,200.00
AC,150.00
AD,500.00

2011:

AB,500.00
AC,250.00
AX,900.00

Они загружаются в отдельные объекты DataFrame.

Я хотел бы получить категорию,сумма категории и частота категории, например:

2010:

AB,300.00,2
AC,150.00,1
AD,500.00,1

2011:

AB,500.00,1
AC,250.00,1
AX,900.00,1

Не могу понять,Я должен использовать pivot/crosstab/groupby/an index и т.д ... Я могу получить сумму или частоту - я не могу получить и то и другое ... Это становится немного сложнее, потому что я хотел бы делать это месяц за месяцемоснова, но я думаю, что если кто-то будет так любезен, чтобы указать мне правильную технику / направление, я смогу пойти оттуда.

Ответы [ 2 ]

16 голосов
/ 08 марта 2012

v0.21 ответ

Использование pivot_table с параметром index:

df.pivot_table(index='category', aggfunc=[len, sum])

           len   sum
         value value
category            
AB           2   300
AC           1   150
AD           1   500

<= v0.12

Это можно сделать с помощью pivot_table для заинтересованных:

In [8]: df
Out[8]: 
  category  value
0       AB    100
1       AB    200
2       AC    150
3       AD    500

In [9]: df.pivot_table(rows='category', aggfunc=[len, np.sum])
Out[9]: 
            len    sum
          value  value
category              
AB            2    300
AC            1    150
AD            1    500

Обратите внимание, что столбцы результата иерархически проиндексированы,Если бы у вас было несколько столбцов данных, вы бы получили такой результат:

In [12]: df
Out[12]: 
  category  value  value2
0       AB    100       5
1       AB    200       5
2       AC    150       5
3       AD    500       5

In [13]: df.pivot_table(rows='category', aggfunc=[len, np.sum])
Out[13]: 
            len            sum        
          value  value2  value  value2
category                              
AB            2       2    300      10
AC            1       1    150       5
AD            1       1    500       5

Основная причина использования __builtin__.sum против np.sum заключается в том, что вы получаете NA-обработку от последнего.Вероятно, может перехватить встроенный Python, сделаю заметку об этом сейчас.

12 голосов
/ 08 марта 2012

Предполагая, что у вас есть файл с именем 2010.csv с содержимым

category,value
AB,100.00
AB,200.00
AC,150.00
AD,500.00

Затем, используя возможность применения нескольких функций агрегирования, следующих за groupby , вы можете сказать:

import pandas
data_2010 = pandas.read_csv("/path/to/2010.csv")
data_2010.groupby("category").agg([len, sum])

Вы должны получить результат, похожий на

          value     
            len  sum
category            
AB            2  300
AC            1  150
AD            1  500

Обратите внимание, что Уэс, скорее всего, придет, чтобы указать, что сумма оптимизирована, и что вам, вероятно, следует использовать np.sum.

...