Clasificando una serie de pandas

Estoy tratando de averiguar cómo ordenar las Series generadas como resultado de una agregación groupby de una manera inteligente.

Genero una agregación de mi DataFrame como este:

means = df.testColumn.groupby(df.testCategory).mean() 

Esto se traduce en una serie. Ahora trato de ordenar esto por valor, pero aparece un error:

 means.sort() ... -> Exception: This Series is a view of some other array, to sort in-place you must create a copy 

Entonces bash crear una copia:

 meansCopy = Series(means) meansCopy.sort() -> Exception: This Series is a view of some other array, to sort in-place you must create a copy 

¿Cómo puedo conseguir este tipo de trabajo?

Pandas v0.17 +

Utilice sort_values , es decir means = means.sort_values() .

Respuesta original, pre v0.17

Trate de usar order , es decir, means = means.order() .

v0.23 + Respuesta: order , sort , sort , sortUp sortDown , etc. están en desuso.

En su lugar, hay otras funciones con nombres más apropiados para usar con Pandas DataFrames y Series. Uno de estos métodos es Series.sort_values .

 # Setup. np.random.seed(0) df = pd.DataFrame({'A': list('aaabbbbccddd'), 'B': np.random.choice(5, 12)}) ser = df.groupby('A')['B'].mean() ser A a 2.333333 b 2.500000 c 3.000000 d 1.333333 Name: B, dtype: float64 

 ser.sort_values() A d 1.333333 a 2.333333 b 2.500000 c 3.000000 Name: B, dtype: float64 

Si necesita una clasificación en orden descendente, especifique ascending=False , como indican los documentos:

 ser.sort_values(ascending=False) A c 3.000000 b 2.500000 a 2.333333 d 1.333333 Name: B, dtype: float64 

También puede llamar a Series.argsort y Series.argsort con __getitem__ / Series.iloc :

 ser[ser.argsort()] A d 1.333333 a 2.333333 b 2.500000 c 3.000000 Name: B, dtype: float64 

 ser.iloc[ser.argsort()] A d 1.333333 a 2.333333 b 2.500000 c 3.000000 Name: B, dtype: float64 

Puedes hacer lo mismo con numpy.argsort (debería ser un poco más rápido):

 ser[np.argsort(ser)] # ser[np.argsort(ser.values)] A d 1.333333 a 2.333333 b 2.500000 c 3.000000 Name: B, dtype: float64 

Si necesita una clasificación en orden descendente, niegue primero su ser :

 ser[(-ser).argsort()] A c 3.000000 b 2.500000 a 2.333333 d 1.333333 Name: B, dtype: float64 

El proceso es el mismo para los otros métodos similares.


Por último, si solo te preocupan los valores (y no el índice), usa np.sort :

 np.sort(ser) # array([1.33333333, 2.33333333, 2.5 , 3. ]) 

Como nota al margen, la clasificación en el lugar es posible pero no se recomienda:

 ser.values.sort() 

Ordenará los valores de la serie en el lugar, pero no modificará el índice, por lo que técnicamente es incorrecto.