2012-06-06 8 views
5

Tengo un dataframe de unas preguntas de elección múltiple y se le da formato de este modo:¿Cómo convertir pandas dataframe para que el índice sea el único conjunto de valores y datos es el recuento de cada valor?

 Sex Qu1 Qu2 Qu3 
Name 
Bob M 1 2 1 
John M 3 3 5 
Alex M 4 1 2 
Jen F 3 2 4 
Mary F 4 3 4 

Los datos son una calificación de 1 a 5 para las 3 preguntas de elección múltiple. Quiero reorganizar los datos para que el índice sea el rango (1,6) donde 1 = 'malo', 2 = 'pobre', 3 = 'ok', 4 = 'bueno', 5 = 'excelente', las columnas son lo mismo y los datos son el recuento de las ocurrencias de números de los valores (excluida la columna Sexo). Esto es básicamente un histograma de tamaños de contenedores fijos y el eje x etiquetado con cadenas. Me gusta la salida de df.plot() mucho mejor que df.hist() para esto, pero no puedo encontrar la forma de reorganizar la tabla para darme un histograma de datos. Además, ¿cómo cambias las etiquetas x para que sean cadenas?

Respuesta

17

Series.value_counts le da el histograma que está buscando:

In [9]: df['Qu1'].value_counts() 
Out[9]: 
4 2 
3 2 
1 1 

lo tanto, aplicar esta función a cada una de las 3 columnas:

In [13]: table = df[['Qu1', 'Qu2', 'Qu3']].apply(lambda x: x.value_counts()) 

In [14]: table 
Out[14]: 
    Qu1 Qu2 Qu3 
1 1 1 1 
2 NaN 2 1 
3 2 2 NaN 
4 2 NaN 2 
5 NaN NaN 1 

In [15]: table = table.fillna(0) 

In [16]: table 
Out[16]: 
    Qu1 Qu2 Qu3 
1 1 1 1 
2 0 2 1 
3 2 2 0 
4 2 0 2 
5 0 0 1 

Usando table.reindex o table.ix[some_array] puede reorganizar los datos .

Transformar a las cadenas, utilice table.rename:

In [17]: table.rename(index=str) 
Out[17]: 
    Qu1 Qu2 Qu3 
1 1 1 1 
2 0 2 1 
3 2 2 0 
4 2 0 2 
5 0 0 1 

In [18]: table.rename(index=str).index[0] 
Out[18]: '1' 
+0

Esto es justo lo que necesitaba. Gracias. El único problema que encontré es cuando normalicé los datos en porcentaje (por columna) y usé los nombres para algunos de los índices y luego los tracé; las etiquetas del eje x fueron incorrectamente aplastadas hacia la izquierda. Si dejo el índice como enteros o valores de datos como enteros, funciona correctamente. – dailyglen

Cuestiones relacionadas