Эффективно переупорядочить DataFrame списков / пар - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть вопрос эффективности.По сути, у меня есть датафрейм, заполненный списками.Каждый список содержит значение и строку, описывающую это значение (я предполагал, что формат списка будет самым простым способом сортировки пар).Мне нужно отдельно изменить порядок значений в каждой строке с наибольшим значением слева и самым низким значением справа.Я нашел решение для этого, но, учитывая, что я новичок в программировании, я хотел бы знать, если вы считаете, что есть более быстрый способ выполнить эту операцию без итерации по индексам.Пожалуйста, не стесняйтесь предоставлять любые ваши отзывы.Единственное требование, которое у меня есть, это то, что окончательное решение - это фрейм данных, в котором за значением сразу следует его строковый дескриптор (строковый дескриптор может находиться в собственном смежном столбце, не обязательно в списке).

Начиная DF:

import pandas as pd
import numpy as np
master_stop = pd.DataFrame([[[56,'Support'],[58, 'MA']],
                            [[24.4, 'Support'],[23.3,'MA'],[25,'MA']]],
                           ['Symbol_1','Symbol_2']).fillna(np.NaN)
master_stop

Out[2]: 
                        0           1         2
Symbol_1    [56, Support]    [58, MA]       NaN
Symbol_2  [24.4, Support]  [23.3, MA]  [25, MA]

Метод сортировки, который я хочу улучшить:

def sort_df():
    for index in master_stop.index:
        master_stop.loc[index] = master_stop.loc[index].sort_values(ascending=False).values

Сортировка DF:

sort_df()
master_stop
Out[3]: 
                 0                1           2
Symbol_1  [58, MA]    [56, Support]         NaN
Symbol_2  [25, MA]  [24.4, Support]  [23.3, MA]

1 Ответ

0 голосов
/ 22 ноября 2018

Использование stack, sort_values, sort_index и unstack может сделать эту работу.Не в одной строке, но если вы сделаете

master_stack = master_stop.stack().sort_index(level=0,ascending=[True])
master_stop = (pd.Series(data = master_stack.sort_values(ascending=False).sort_index(level=0,ascending=[True]).values,
                         index = master_stack.index)
                 .unstack())

, то master_stop будет отсортировано, как и ожидалось

                 0                1           2
Symbol_1  [58, MA]    [56, Support]         NaN
Symbol_2  [25, MA]  [24.4, Support]  [23.3, MA]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...