Сортировать 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')
