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à.

22
demandé sur coldspeed 2012-03-06 21:01:47

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.

12
répondu Jeff Hammerbacher 2012-03-08 16:08:29

v0.21 réponse

Utiliser pivot_tableindex 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.

16
répondu Wes McKinney 2017-12-30 10:21:54