python - pivot_table - Tabulación cruzada simple en pandas
plot a pivot table pandas (2)
Tropecé 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 se supone que 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?
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 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í.
v0.21
respuesta
Use 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 se obtiene manejo NA de este último. Probablemente podría interceptar el Python incorporado, hará una nota sobre eso ahora.
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, usando la habilidad de aplicar múltiples funciones de agregación luego de un groupby , 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 parece a algo
value
len sum
category
AB 2 300
AC 1 150
AD 1 500
Tenga en cuenta que Wes probablemente se acerque para señalar que la suma está optimizada y que probablemente debería usar np.sum.