Simple tabulación cruzada en pandas.

Me topé con pandas y parece ideal para cálculos simples que me gustaría hacer. Tengo un historial en SAS y pensé que reemplazaría a la frecuencia de proc. Parece que se ajustará a lo que quizás quiera hacer en el futuro. Sin embargo, parece que no puedo entender una tarea simple (no estoy seguro de si debo ver pivot/crosstab/indexing – si debo tener un Panel o DataFrames etc.). ¿Podría alguien darme algunos consejos sobre cómo hacer lo siguiente:

Tengo dos archivos CSV (uno para el año 2010, uno para el año 2011 – datos transaccionales simples) – Las columnas son categoría y cantidad

2010:

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

2011:

 AB,500.00 AC,250.00 AX,900.00 

Estos se cargan en objetos DataFrame separados.

Lo que me gustaría hacer es obtener la categoría, la sum de la categoría y la frecuencia de la categoría, por ejemplo:

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 

No puedo saber si debo usar pivot/crosstab/groupby/an index etc … Puedo obtener la sum o la frecuencia. Parece que no puedo obtener ambas … Se vuelve un poco más complejo porque me gustaría hacerlo mes por mes, pero creo que si alguien fuera tan amable de indicarme la técnica / dirección correcta, podré ir a partir de ahí.

Suponiendo que tiene un archivo llamado 2010.csv con contenido

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

Luego, utilizando la capacidad de aplicar múltiples funciones de agregación siguiendo un grupo , puede decir:

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

Deberías obtener un resultado que se parezca a

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

Tenga en cuenta que Wes probablemente vendrá a señalar que la sum está optimizada y que probablemente debería usar np.sum.

v0.21 respuesta

Utilice pivot_table con el parámetro de 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

Es posible hacer esto usando pivot_table para aquellos interesados:

 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 

Tenga en cuenta que las columnas del resultado están indexadas jerárquicamente. Si tuviera varias columnas de datos, obtendría un resultado como este:

 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 

La razón principal para usar __builtin__.sum vs. np.sum es que obtiene el manejo de NA de este último. Probablemente podría interceptar el Python incorporado, hará una nota sobre eso ahora.