2014-09-24 2 views
5

Я пытаюсь найти имя столбца, связанное с наибольшими и вторым наибольшими значениями в DataFrame, вот упрощенный пример (реальный имеет более 500 столбцов):панды второго по величине значения в

Date val1 val2 val3 val4 
1990 5  7 1 10 
1991 2  1 10 3 
1992 10 9 6 1 
1993 50 10 2 15 
1994 1  15 7 8 

потребности стать:

Date 1larg 2larg 
1990 val4 val2 
1991 val3 val4 
1992 val1 val2 
1993 val1 val4 
1994 val2 val4 

я могу найти имя столбца с наибольшим значением (я, е, 1larg выше) с idxmax, но как я могу найти второй по величине?

ответ

6

(У вас нет никаких дубликатов максимальных значений в ваших рядах, так что я думаю, что если у вас есть [1,1,2,2] вы хотите val3 и val4 быть выбраны.)

Один из способов будет использовать результат от argsort как индекс в серии с именами столбцов.

df = df.set_index("Date") 
arank = df.apply(np.argsort, axis=1) 
ranked_cols = df.columns.to_series()[arank.values[:,::-1][:,:2]] 
new_frame = pd.DataFrame(ranked_cols, index=df.index) 

производит

  0  1 
Date    
1990 val4 val2 
1991 val3 val4 
1992 val1 val2 
1993 val1 val4 
1994 val2 val4 
1995 val4 val3 

(где я добавил дополнительный 1995 [1,1,2,2] ряд.)

В качестве альтернативы, вы могли бы, вероятно, melt в плоский формат, выбрать самые большие два значения каждой группы дат, а затем снова повернуть его.

+0

Thx, первый работал отлично! – AtotheSiv

+0

Как указано выше, это сработало, но я столкнулся с проблемами достаточно скоро. Я столкнулся с ситуацией, когда все значения, кроме одного, являются нулями. Похоже, что Python затем просто принимает самые большие значения и два нуля произвольно (или справа). Есть ли способ создать ненулевое имя столбца два раза (оба в столбцах 0 и 1)? – AtotheSiv

Смежные вопросы