【问题标题】:Pandas dataframe ranked by multiple columns (combination key)Pandas 数据框按多列排序(组合键)
【发布时间】:2018-08-04 00:56:56
【问题描述】:

有没有一种 Python 的方法可以通过组合键对下面描述的数据帧进行排序 - 首先是 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

【问题讨论】:

  • 试试print(df_sorted_orders[cols].rank(method='dense'))看看它返回了什么。
  • df_sorted_orders['ORD_RANK'] 表示您将收到一个系列。您正在传递一个数据框
  • 是的,我看到了问题所在。我的目标是创建一个按这 3 列对数据进行排序的单一排名。我该如何修改它以获得那个输出?

标签: python pandas dataframe rank


【解决方案1】:

因为在您的左侧返回 3 列,因此您必须将它们分配回两 3 列而不是一列

for x in cols:
    df[x + 'rank'] = df[x].rank(method='dense') 

【讨论】:

  • 抱歉,之前忘了提我的最终目标。我想创建一个按这 3 列对数据进行排序的排名。不想要 3 个单独的等级。
  • 它们的权重相等吗? @Crypticlight
  • @Crypticlight 如果是这样,请尝试df[cols].rank(method='dense').sum(1).rank(method='dense')
  • 这行不通,因为它没有按层次排序。我可以从 3 列中创建一个组合键,但想知道是否有一种 Python 的方式来进行这种类型的排名。
  • @Crypticlight 我认为这是一个误导性的问题,您想编辑还是关闭并重新打开一个新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2021-03-27
  • 2014-11-17
  • 2020-10-13
  • 2020-02-29
  • 2017-12-26
相关资源
最近更新 更多