Tableau croisé Simple dans les pandas
je suis tombé sur pandas et il semble idéal pour les calculs simples que je voudrais faire. J'ai de l'expérience avec le SAS et je pensais que ça remplacerait le proc freq -- on dirait que ça va s'adapter à ce que je pourrais vouloir faire dans le futur. Cependant, je n'arrive pas à me concentrer sur une tâche simple (Je ne suis pas sûr si je suis censé regarder pivot/crosstab/indexing
- si je devrais avoir un Panel
ou DataFrames
etc...). Quelqu'un pourrait-il me donner quelques conseils sur la façon de faire de suivantes:
j'ai deux fichiers CSV (un pour l'année 2010, un pour l'année 2011 - données transactionnelles simples) - les colonnes sont catégorie et montant
2010:
AB,100.00
AB,200.00
AC,150.00
AD,500.00
2011:
AB,500.00
AC,250.00
AX,900.00
ceux-ci sont chargés dans des objets DataFrame séparés.
Ce que je voudrais faire est d'obtenir la catégorie, la somme de la catégorie, et la fréquence de la catégorie, par exemple:
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
je ne peux pas savoir si je dois utiliser pivot/crosstab/groupby/an index
etc... Je peux obtenir la somme ou la fréquence - Je ne peux pas avoir les deux... Cela devient un peu plus complexe parce que j'aimerais le faire sur une base mensuelle, mais je pense que si quelqu'un avait la gentillesse de me montrer la bonne technique/direction, je serais en mesure de partir de là.
2 réponses
en Supposant que vous avez un fichier appelé 2010.csv avec un contenu
category,value
AB,100.00
AB,200.00
AC,150.00
AD,500.00
puis, en utilisant la capacité d'appliquer fonctions d'agrégation multiples suivant un groupby, vous pouvez dire:
import pandas
data_2010 = pandas.read_csv("/path/to/2010.csv")
data_2010.groupby("category").agg([len, sum])
Vous devriez obtenir un résultat qui ressemble à quelque chose comme
value
len sum
category
AB 2 300
AC 1 150
AD 1 500
Notez que Wes arrivera vraisemblablement à remarquer que la somme est optimisé et que vous devriez probablement utiliser np.somme.
v0.21
réponse
Utiliser pivot_table
index
paramètre:
df.pivot_table(index='category', aggfunc=[len, sum])
len sum
value value
category
AB 2 300
AC 1 150
AD 1 500
<= v0.12
il est possible de faire cela en utilisant pivot_table
pour ceux que ça intéresse:
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
notez que les colonnes du résultat sont hiérarchiquement indexées. Si vous aviez plusieurs colonnes de données, vous obtiendriez un résultat comme ceci:
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
le principale raison d'utiliser __builtin__.sum
vs. np.sum
est ce que vous obtenez NA-de la manipulation de ce dernier. Pourrait probablement intercepter le Python intégré, fera une note à ce sujet maintenant.