Сортировать pandas DataFrame с функцией по значениям столбцов

на основе python, сортировка по убыванию фрейма данных с пандами:

дано:

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 тогда выглядит так:

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

Я хотел бы иметь что-то вроде:

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

это должно упорядочить полный фрейм данных относительно суммы квадратов значений столбцов "один" и " два " и дать мне:

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

восходящий или нисходящий порядок не имеет значения. Есть хороший и простой способ сделать это? Я пока не удалось найти решение.

3 ответов


вы можете создать временный столбец для использования в сортировке, а затем бросить его:

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)

просто понял, что ты хотел этого:

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

вы пытались создать новый столбец, а затем отсортировать его. Я не могу прокомментировать исходное сообщение, поэтому я просто публикую свое решение.

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