Python выборка сортировки строк данных - PullRequest
1 голос
/ 29 февраля 2020
import pandas as pd
data9 = pd.DataFrame([[1, 2, 3, 03:10:20:170, 'NEW',90.1060,'Agency'], [1, 2, 3, 03:10:20:144, 'Trade',90.1050,'Principal'], [1, 2, 3, 03:10:20:120, 'NEW',90.1022,'Agency'],[1, 2, 3, 03:10:20:100, 'NEW',90.1070,'Agency'], [1, 2, 3, 03:10:20:155, 'NEW',90.1051,'Principal']], columns=['A', 'B','C','D','E','F','G'])

Мне нужно найти строки в кадре данных, в которых выполняются эти условия:

Я хочу выбрать строки сортировки так, чтобы: OrderDirection было «SELL», а затем «PRINCIPAL». элемент в OrderType с соответствующим элементом «TRADE» в столбце OrderStatus должен быть больше , чем цена элемента «AGENCY» в столбце OrderType с соответствующим элементом «NEW» в столбце OrderStatus. Так что в результирующей таблице есть только строки ниже. Чтобы сделать это, он должен пройти через весь фрейм данных и найти все наборы строк, которые удовлетворяют условию выше.

[1, 2, 3, 03:10:20:120, 'NEW',90.1022,'Agency']
[1, 2, 3, 03:10:20:144, 'Trade',90.1050,'Principal']

Я получил ошибку: KeyError: 'метка [True] отсутствует в [ index] '

Как мне это решить?

Ниже кода:

 def selection_sort(nums):
        # This value of i corresponds to how many values were sorted
        for i, row in nums.iterrows():
        # We assume that the first item of the unsorted segment is the smallest
            lowest_value_index = i
            # This loop iterates over the unsorted items
            for j in (i + 1, range(len(nums.F))):
                if row.loc[row['G'] == 'Agency', 'F'].iloc[lowest_value_index] > row.loc[row['G'] == 'Principal', 'F' ].iloc[j]:
                    lowest_value_index = j
            # Swap values of the lowest unsorted element with the first unsorted
            # element
    row.loc[row['G'] == 'Principal', 'F'].iloc[i], row.loc[row['G'] == 'Agency', 'F'].iloc[lowest_value_index]  =  row.loc[row['G'] == 'Agency' , 'F'].iloc[lowest_value_index], row.loc[row['G'] == 'Principal', 'F'].iloc[i]

    selection_sort(data19)

1 Ответ

0 голосов
/ 29 февраля 2020

можно попробовать .sort_values() и .rank(). Вот что я получил из предоставленного вами DataFrame (поле времени нуждается в кавычках, BTW).

data9 = pd.DataFrame([
        [1, 2, 3, '03:10:20:170', 'NEW', 90.1060, 'Agency'],
        [1, 2, 3, '03:10:20:144', 'Trade', 90.1050, 'Principal'],
        [1, 2, 3, '03:10:20:120', 'NEW', 90.1022, 'Agency'],
        [1, 2, 3, '03:10:20:100', 'NEW', 90.1070, 'Agency'],
        [1, 2, 3, '03:10:20:155', 'NEW', 90.1051, 'Principal']
        ], columns=['A', 'B','C','D','E','F','G'])

Сортировка по столбцам F и G, хотя вы, вероятно, могли бы добавить временное перечисление для номинальных значений, чтобы убедиться, что они ' отсортированы в правильном направлении для ваших целей. Или добавьте в столбце времени.

Эта схема заказа здесь работает, потому что:

  • "Агентство" <"Принципал", </p>

  • 90.1022 <90.1050, </p>

  • "NEW" <"Trade" и </p>

  • 03: 10: 20: 120 <03: 10: 20: 144. </p>

В любом случае, .sort_values() также может быть inplace, если вы хотите использовать это.

In [0]: data9 = data9.sort_values(by=["F","G"], ascending=[True, True])

Данные вызова9 чтобы проверить результаты:

In [1]: data9
Out[1]:
   A  B  C             D      E        F          G
2  1  2  3  03:10:20:120    NEW  90.1022     Agency
1  1  2  3  03:10:20:144  Trade  90.1050  Principal
4  1  2  3  03:10:20:155    NEW  90.1051  Principal
0  1  2  3  03:10:20:170    NEW  90.1060     Agency
3  1  2  3  03:10:20:100    NEW  90.1070     Agency

Затем мы можем ранжировать столбец «F» (вы можете использовать больше столбцов, просто включите их в список, как при использовании сортировки). После этого мы просто используем условие для выбора верхних 2 (что-нибудь ниже 3) и производим результаты, аналогичные ожидаемым.

In [1]: data9.loc[data9.loc[:, "F"].rank() < 3.0, :]
Out[1]:
   A  B  C             D      E        F          G
2  1  2  3  03:10:20:120    NEW  90.1022     Agency
1  1  2  3  03:10:20:144  Trade  90.1050  Principal
...