Quiero ordenar por longitud de nombre. No parece haber un parámetro key para sort_values , por lo que no estoy seguro de cómo lograrlo. Aquí hay una prueba df:
import pandas as pd df = pd.DataFrame({'name': ['Steve', 'Al', 'Markus', 'Greg'], 'score': [2, 4, 2, 3]})Puede usar la reindex del index de Series creado por len con sort_values :
print (df.name.str.len()) 0 5 1 2 2 6 3 4 Name: name, dtype: int64 print (df.name.str.len().sort_values()) 1 2 3 4 0 5 2 6 Name: name, dtype: int64 s = df.name.str.len().sort_values().index print (s) Int64Index([1, 3, 0, 2], dtype='int64') print (df.reindex(s)) name score 1 Al 4 3 Greg 3 0 Steve 2 2 Markus 2 df1 = df.reindex(s) df1 = df1.reset_index(drop=True) print (df1) name score 0 Al 4 1 Greg 3 2 Steve 2 3 Markus 2Usando DataFrame.sort_values con argumento key desde pandas >= 1.1.0 :
Ahora podemos pasar la longitud de la cadena o cualquier otra clave personalizada en el método sort_values :
df = pd.DataFrame({ 'name': ['Steve', 'Al', 'Markus', 'Greg'], 'score': [2, 4, 2, 3] }) print(df) name score 0 Steve 2 1 Al 4 2 Markus 2 3 Greg 3 df.sort_values(by="name", key=lambda x: x.str.len()) name score 1 Al 4 3 Greg 3 0 Steve 2 2 Markus 2Encontré esta solución más intuitiva, especialmente si quieres hacer algo dependiendo de la longitud de la columna más adelante.
df['length'] = df['name'].str.len() df.sort_values('length', ascending=False, inplace=True) Ahora su marco de datos tendrá una columna con la length del nombre con el valor de la longitud de la cadena del name de la columna y todo el marco de datos se ordenará en orden descendente.