Кадр данных Pandas ранжируется по нескольким столбцам (комбинационный ключ)

1

Существует ли pythonic способ сортировки данных, описанного ниже, с помощью комбинированного ключа - сначала ORD_DT_KEY, затем ORD_TM_KEY, а затем ORD_KEY; и сохранить ранг в другом столбце ORD_RANK?

Код ниже не работает, поскольку он создает 3 отдельных ранга и выдает ошибку, когда я пытаюсь назначить его одному столбцу.

import pandas as pd

#Read orders data stored in a pipe delimeted file
df_raw_orders = pd.read_table("Dummy_order_data.txt", delimiter="|")

print df_raw_orders.head()

df_sorted_orders = df_raw_orders
cols = ['ORD_DT_KEY','ORD_TM_KEY','ORD_KEY']
df_sorted_orders['ORD_RANK'] = df_sorted_orders[cols].rank(method='dense')

Входные данные Dummy_order_data.txt следующие:

ORD_KEY|ORD_DT_KEY|ORD_TM_KEY|QTY|SKU_KEY
10001|1|0|1|1
10001|1|0|1|2
10001|1|0|1|3
10002|2|0|1|1
10002|2|0|1|3
10003|3|0|1|4
10004|4|0|1|4
10004|4|0|1|5
10005|5|0|1|1
10006|6|0|1|1
10006|6|0|1|4
10007|7|0|1|3
10007|7|0|1|4
10008|8|0|1|5
10009|9|0|1|1
10009|9|0|1|4
10009|9|0|1|5
10010|10|0|2|1
10010|10|0|2|2
10010|10|0|2|3
10011|11|0|1|1
10011|11|0|1|3
10012|12|0|1|4
10012|12|0|1|5
10013|13|0|1|1
10014|14|0|2|1
10014|14|0|2|4

Требуемый вывод:

ORD_KEY ORD_DT_KEY  ORD_TM_KEY  SKU_KEY QTY ORD_RANK
10001   1   0   1   1   1
10001   1   0   2   1   1
10001   1   0   3   1   1
10002   2   0   1   1   2
10002   2   0   3   1   2
10003   3   0   4   1   3
10004   4   0   4   1   4
10004   4   0   5   1   4
10005   5   0   1   1   5
10006   6   0   1   1   6
10006   6   0   4   1   6
10007   7   0   3   1   7
10007   7   0   4   1   7
10008   8   0   5   1   8
10009   9   0   1   1   9
10009   9   0   4   1   9
10009   9   0   5   1   9
10010   10  0   1   2   10
10010   10  0   2   2   10
10010   10  0   3   2   10
10011   11  0   1   1   11
10011   11  0   3   1   11
10012   12  0   4   1   12
10012   12  0   5   1   12
10013   13  0   1   1   13
10014   14  0   1   2   14
10014   14  0   4   2   14
  • 1
    Попробуйте print(df_sorted_orders[cols].rank(method='dense')) чтобы увидеть, что он возвращает.
  • 1
    df_sorted_orders['ORD_RANK'] подразумевает, что вы получите серию. Вы передаете фрейм данных
Показать ещё 1 комментарий
Теги:
pandas
dataframe
rank

1 ответ

2

Причина в вашем левом возврате 3 столбца, поэтому вам нужно назначить их обратно на два 3 столбца, а не на один

for x in cols:
    df[x + 'rank'] = df[x].rank(method='dense') 
  • 0
    Извините, забыл упомянуть мою конечную цель раньше. Я хочу создать один ранг, который сортирует данные по этим 3 столбцам. Не хотите 3 отдельных званий.
  • 0
    равны ли они по весу? @Crypticlight
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню