2012-08-15 23 views
6

En un sentido muy general, el problema que estoy tratando de resolver es cambiar un componente de un índice de varios niveles en columnas. Es decir, tengo un Series que contiene un índice multinivel y quiero que el nivel más bajo del índice cambie a columnas en un dataframe. Aquí está el problema real ejemplo, yo estoy tratando de resolver,MultiLevel index to columns: obtener value_counts como columnas en pandas

Aquí podemos generar algunos datos de muestra:

foo_choices = ["saul", "walter", "jessee"] 
bar_choices = ["alpha", "beta", "foxtrot", "gamma", "hotel", "yankee"] 

df = DataFrame([{"foo":random.choice(foo_choices), 
       "bar":random.choice(bar_choices)} for _ in range(20)]) 
df.head() 

que nos da,

 bar  foo 
0 beta jessee 
1 gamma jessee 
2 hotel saul 
3 yankee walter 
4 yankee jessee 
... 

Ahora, puedo GroupBy bar y obtener el valor_contactos del campo foo,

dfgb = df.groupby('foo') 
dfgb['bar'].value_counts() 

y se da salida,

foo    
jessee hotel  4 
     gamma  2 
     yankee  1 
saul foxtrot 3 
     hotel  2 
     gamma  1 
     alpha  1 
walter hotel  2 
     gamma  2 
     foxtrot 1 
     beta  1 

Pero lo que quiero es algo así como,

  hotel beta foxtrot alpha gamma yankee 
foo       
jessee  1  1  5   4  1  1 
saul  0  3  0   0  1  0 
walter  1  0  0   1  1  0 

Mi solución fue escribir los siguientes bits:

for v in df['bar'].unique(): 
    if v is np.nan: continue 
    df[v] = np.nan 
    df.ix[df['bar'] == v, v] = 1 

dfgb = df.groupby('foo') 
dfgb.count()[df['bar'].unique()] 

Respuesta

9

Creo que desee:

dfgb['bar'].value_counts().unstack().fillna(0.) 
+0

GRACIAS ¡TÚ! ¿Dónde se ha escondido 'Desbloquear'? – milkypostman

Cuestiones relacionadas