2012-03-06 43 views
22

Me encontré con pandas y parece ideal para cálculos simples que me gustaría hacer. Tengo antecedentes de SAS y pensaba que reemplazaría proc freq, parece que se ampliará a lo que pueda querer hacer en el futuro. Sin embargo, parece que no puedo entender una tarea simple (no estoy seguro si debo mirar pivot/crosstab/indexing - si debería tener un Panel o DataFrames etc ...). Podría alguien darme algunos consejos sobre cómo hacer lo siguiente:Tabulación cruzada simple en pandas

Tengo dos archivos CSV (una para el año 2010, uno para el año 2011 - datos transaccionales simples) - Las columnas son de categoría y la 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 trama de datos separadas.

Lo que me gustaría hacer es obtener la categoría, la suma 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 determinar si debería usar pivot/crosstab/groupby/an index etc ... Puedo obtener la suma o la frecuencia, parece que no puedo obtener ambas ... Se vuelve un poco más compleja 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 desde allí.

+0

Entonces, ¿está diciendo que cada archivo '.csv' es solo una fila, y luego en esa única fila, el primer valor es el año seguido de los datos tal como se presentan arriba? – benjaminmgross

+0

Hola Factor3, así es como S/O decidió formatearlo (la primera vez que lo usé, así que tendré que buscarlo en el futuro) ... Déjenme aclarar ... hay dos archivos: 2010. csv y 2011.csv; estos contienen 'n' muchas filas, cada una de las cuales contiene dos columnas. Estaba tratando de simplificar la pregunta, pero estoy de acuerdo en que el formato es algo engañoso ahora que lo he leído. –

+0

He proporcionado varios ejemplos detallados y enfoques alternativos en este [** Q & A **] (https://stackoverflow.com/q/47152691/2336654) que usted u otros pueden encontrarle útil. – piRSquared

Respuesta

12

Asumiendo que usted tiene un archivo llamado 2010.csv con contenidos

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

Luego, utilizando la capacidad de aplicar multiple aggregation functions following a groupby, se puede decir:

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

usted debe conseguir un resultado que se ve algo así como

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

Tenga en cuenta que Wes probablemente pasará a punto esa suma está optimizada y que probablemente deba usar np.sum.

+0

Ese es el impulso que necesitaba - TY. Estaba intentando todo tipo de cosas con pivot_table (data_2010, rows = '???', aggfunc = {'???': '???'}) etc ... Tenía la sensación de que estaba complicando demasiado el problema. Gracias de nuevo. –

16

v0.21 respuesta

Uso pivot_table con el parámetro 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 utilizando pivot_table para los 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 se indexan jerárquicamente. Si usted tenía varias columnas de datos, se llega 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 se llega NA-manejo de este último. Probablemente podría interceptar el Python incorporado, hará una nota sobre eso ahora.