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?
Utilice sort_values
, es decir means = means.sort_values()
.
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.