Ordenar pandas DataFrame con función sobre valores de columna

Basado en python, ordena el dataframe descendente con pandas :

Dado:

from pandas import DataFrame import pandas as pd d = {'one':[2,3,1,4,5], 'two':[5,4,3,2,1], 'letter':['a','a','b','b','c']} df = DataFrame(d) 

df entonces se ve así:

 df: letter one two 0 a 2 5 1 a 3 4 2 b 1 3 3 b 4 2 4 c 5 1 

Me gustaría tener algo como:

 f = lambda x,y: x**2 + y**2 test = df.sort(f('one', 'two')) 

Esto debería ordenar el dataframe completo con respecto a la sum de los valores cuadrados de la columna ‘uno’ y ‘dos’ y darme:

 test: letter one two 2 b 1 3 3 b 4 2 1 a 3 4 4 c 5 1 0 a 2 5 

El orden ascendente o descendente no importa. ¿Hay una manera agradable y simple de hacer eso? Todavía no pude encontrar una solución.

Puedes crear una columna temporal para usar en ordenación y luego soltarla:

 df.assign(f = df['one']**2 + df['two']**2).sort_values('f').drop('f', axis=1) Out: letter one two 2 b 1 3 3 b 4 2 1 a 3 4 4 c 5 1 0 a 2 5 
 from pandas import DataFrame import pandas as pd d = {'one':[2,3,1,4,5], 'two':[5,4,3,2,1], 'letter':['a','a','b','b','c']} df = pd.DataFrame(d) #f = lambda x,y: x**2 + y**2 array = [] for i in range(5): array.append(df.ix[i,1]**2 + df.ix[i,2]**2) array = pd.DataFrame(array, columns = ['Sum of Squares']) test = pd.concat([df,array],axis = 1, join = 'inner') test = test.sort_index(by = "Sum of Squares", ascending = True).drop('Sum of Squares',axis =1) 

Acabo de darme cuenta de que querías esto:

  letter one two 2 b 1 3 3 b 4 2 1 a 3 4 4 c 5 1 0 a 2 5 

¿Has intentado crear una nueva columna y luego ordenarla? No puedo comentar sobre la publicación original, así que solo estoy publicando mi solución.

 df['c'] = df.a**2 + df.b**2 df = df.sort_values('c')