2016-07-29 5 views
3

на основе python, sort descending dataframe with pandas:Сортировать панды DataFrame с функцией по колонке значений

Дано:

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: 
     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')) 

Это должно заказать полный dataframe по отношению к сумме квадратов значений столбца «один» и «два» и дать мне:

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

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

ответ

8

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

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 
+1

Спасибо, это, похоже, способ сделать это, как я уже выяснил в то же время :-) Но спасибо, ваше решение очень компактно и элегантно. – Ohumeronen

+1

Гораздо более компактный, чем мой ответ +1. –

+0

@ Адам Уорнер: Ничего. Спасибо за вашу помощь в любом случае ;-) – Ohumeronen

0

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

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

На самом деле это то, что Я делаю сейчас ... Могли бы вы опубликовать свое предложение в качестве комментария и удалить свой ответ? Я отправлю свое решение в ближайшее время. Спасибо за помощь и приветствую здесь! – Ohumeronen

+0

это комментарий не ответ, не уверен, что вы можете прокомментировать. – Merlin

1
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 
Смежные вопросы