2015-06-18 21 views
21

Ho un dataframe che ha le colonneGruppo per indice + colonna panda

  1. id_utente
  2. item_bought

Ecco user_id è l'indice del df. Voglio raggruppare sia user_id che item_bought e ottenere il conteggio saggio dell'articolo per l'utente. Come lo faccio.

Grazie

+5

si dovrebbe essere in grado di fare' df.groupby ([df.index , 'item_bought']). apply (pd.Series.count (level = 0)) ', in realtà non' df.groupby ([df.index, 'item_bought']). Count() 'darti quello che vuoi? – EdChum

+0

Perché non usare rendere questa una risposta? – vumaasha

+0

Viene visualizzato un errore quando provo a raggruppare per [df.index, '']: Grouper e asse devono avere la stessa lunghezza – codekitty

risposta

1
import pandas as pd 

import numpy as np 

In [11]: 

df = pd.DataFrame() 

In [12]: 

df['user_id'] = ['b','b','b','c'] 

In [13]: 

df['item_bought'] = ['x','x','y','y'] 

In [14]: 

df['ct'] = 1 

In [15]: 

df 

Out[15]: 
    user_id  item_bought  ct 
0 b x 1 
1 b x 1 
2 b y 1 
3 c y 1 
In [16]: 

pd.pivot_table(df,values='ct',index=['user_id','item_bought'],aggfunc=np.sum) 

Out[16]: 

user_id item_bought 
b  x    2 
     y    1 
c  y    1 
+0

Perché è stato questo downvoted? Fa esattamente quello che vogliono. – howMuchCheeseIsTooMuchCheese

+0

non mostra come ottenere da un indice + una colonna ai conteggi ... nel tuo esempio user_id è una colonna – codekitty

+0

basta resettare l'indice 'df = df.reset_index()' ... quindi puoi usarlo in un perno – howMuchCheeseIsTooMuchCheese

25

questo dovrebbe funzionare:

>>> df = pd.DataFrame(np.random.randint(0,5,(6, 2)), columns=['col1','col2']) 
>>> df['ind1'] = list('AAABCC') 
>>> df['ind2'] = range(6) 
>>> df.set_index(['ind1','ind2'], inplace=True) 
>>> df 

      col1 col2 
ind1 ind2    
A 0  3  2 
    1  2  0 
    2  2  3 
B 3  2  4 
C 4  3  1 
    5  0  0 


>>> df.groupby([df.index.get_level_values(0),'col1']).count() 

      col2 
ind1 col1  
A 2  2 
    3  1 
B 2  1 
C 0  1 
    3  1 

Ho avuto lo stesso problema con una delle colonne da multiindex. con multiindex, non è possibile utilizzare df.index.levels [0] poiché ha solo valori distinti da quel particolare livello di indice e sarà probabilmente di dimensioni diverse rispetto all'intero dataframe ...

controllo http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.get_level_values.html - get_level_values ​​"Vettore di ritorno dei valori di etichetta per il livello richiesto, pari alla lunghezza dell'indice"

18

Dalla versione 0.20.1 esso è più semplice:

Strings passed to DataFrame.groupby() as the by parameter may now reference either column names or index level names

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], 
      ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] 

index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second']) 

df = pd.DataFrame({'A': [1, 1, 1, 1, 2, 2, 3, 3], 
        'B': np.arange(8)}, index=index) 

print (df) 

       A B 
first second  
bar one  1 0 
     two  1 1 
baz one  1 2 
     two  1 3 
foo one  2 4 
     two  2 5 
qux one  3 6 
     two  3 7 

print (df.groupby(['second', 'A']).sum()) 
      B 
second A 
one 1 2 
     2 4 
     3 6 
two 1 4 
     2 5 
     3 7 
Problemi correlati