2012-03-06 10 views
22

Mi sono imbattuto in pandas e sembra ideale per calcoli semplici che mi piacerebbe fare. Ho uno sfondo SAS e pensavo che avrebbe sostituito proc freq - sembra che si ridimensionerà a quello che potrei voler fare in futuro. Tuttavia, non riesco a capire come funziona (non sono sicuro se dovrei guardare pivot/crosstab/indexing - se dovrei avere un Panel o DataFrames ecc ...). Qualcuno mi potrebbe dare alcune indicazioni su come effettuare le seguenti operazioni:Simple cross-tabulation in panda

Ho due file CSV (uno per l'anno 2010, uno per l'anno 2011 - semplici dati transazionali) - Le colonne sono di categoria e la quantità

2010:

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

2011:

AB,500.00 
AC,250.00 
AX,900.00 

Questi vengono caricati in oggetti dataframe separati.

Quello che mi piacerebbe fare è ottenere la categoria, la somma della categoria, e la frequenza della categoria, ad esempio:

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 

Non riesco a capire se dovrei usare pivot/crosstab/groupby/an index ecc ... Posso ottenere sia la somma che la frequenza - Non riesco a ottenere entrambi ... Diventa un po 'più complesso perché mi piacerebbe farlo di mese in mese, ma penso che se qualcuno fosse così gentile da indicarmi la giusta tecnica/direzione, potrò andare da lì.

+0

Quindi stai dicendo che ogni file '.csv' è solo una singola riga, e quindi in quella singola riga il primo valore è l'anno seguito dai dati mentre lo presenti sopra? – benjaminmgross

+0

Hi Factor3, è proprio il modo in cui S/O ha deciso di formattarlo (la prima volta l'ho usato, quindi dovrò cercarlo in futuro) ... Permettetemi di chiarire ... ci sono due file - 2010. csv e 2011.csv; questi contengono 'n' molte righe ognuna delle quali contiene due colonne. Stavo cercando di semplificare la domanda, ma concordo sul fatto che la formattazione sia in qualche modo fuorviante ora che l'ho letta di nuovo! –

+0

Ho fornito diversi esempi dettagliati e approcci alternativi in ​​questo [** D & R **] (https://stackoverflow.com/q/47152691/2336654) che voi o altri potrebbero trovare utili. – piRSquared

risposta

12

Supponendo che si dispone di un file chiamato 2010.csv con contenuti

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

Quindi, utilizzando la capacità di applicare multiple aggregation functions following a groupby, si può dire:

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

Si dovrebbe ottenere un risultato che sembra qualcosa come

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

Nota che Wes verrà probabilmente a punto la somma è ottimizzata e probabilmente dovresti usare np.sum.

+0

Questa è la spinta di cui avevo bisogno - TY. Stavo provando tutti i tipi con pivot_table (data_2010, rows = '???', aggfunc = {'???': '???'}) ecc ... Avevo la sensazione di complicare troppo il problema. Grazie ancora. –

16

v0.21 risposta

Utilizzare pivot_table con il parametro 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

E 'possibile farlo utilizzando per chi è interessato pivot_table:

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 

Si noti che le colonne del risultato sono gerarchicamente indicizzati. Se tu avessi più colonne di dati, si dovrebbe ottenere un risultato simile a questo:

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 

Il motivo principale per utilizzare __builtin__.sum vs. np.sum è che si ottiene NA-gestione da quest'ultimo. Probabilmente potrebbe intercettare il built-in Python, ne prenderò nota al momento.