根据多列排名DataFrame

时间:2018-03-16 18:18:16

标签: python python-3.x pandas dataframe ranking

如何根据2列对DataFrame进行排名?

在下面的示例中,col_b将成为col_a的平局。

数据帧:

df = pd.DataFrame({'col_a':[0,0,0,1,1,1], 'col_b':[5,2,8,3,7,4]})

df
   col_a  col_b
0      0      5
1      0      2
2      0      8
3      1      3
4      1      7
5      1      4

预期输出:

   col_a  col_b  Rank
0      0      5   2
1      0      2   1
2      0      8   3
3      1      3   4
4      1      7   6
5      1      4   5

4 个答案:

答案 0 :(得分:4)

以下是使用DataFrame.sort_values的单行方法:

ascending

此代码段背后的逻辑:基本上,ascending函数接受多个列名称,并根据传递的列名称的顺序返回数据框的已排序副本。默认排序顺序为column_b,这正是我们想要的。如果您想要另一个订单,您可以将订单作为可互换的布尔值传递给$conn = mysqli_connect("127.0.0.1","root","","databasename"); $query = "select values from table where condition1"; $result = mysqli_query($conn, $query); 关键字参数。最后,$set1 = mysqli_query($conn, "select values from $result where $result[column_name] = value1"; $set2 = mysqli_query($conn, "select values from $result where $result[column_name] = value2"; $set3 = mysqli_query($conn, "select values from $result where $result[column_name] = value3"; 的新索引是我们想要的(加一)。

答案 1 :(得分:2)

这是一种方法。通过对列进行排序并重新编制索引来创建临时DataFrame。然后使用新索引作为排名并加入到原始df。

temp_df = df.sort_values(['col_a', 'col_b']).reset_index()
temp_df['rank'] = temp_df.index + 1
print(temp_df)
#   index  col_a  col_b  rank
#0      1      0      2     1
#1      0      0      5     2
#2      2      0      8     3
#3      3      1      3     4
#4      5      1      4     5
#5      4      1      7     6

'index'对应于原始DataFrame中的索引。使用此功能将temp_df加入df并选择所需的列:

df = df.join(temp_df.set_index('index'), rsuffix="_r")[['col_a', 'col_b', 'rank']]
print(df)
#   col_a  col_b  rank
#0      0      5     2
#1      0      2     1
#2      0      8     3
#3      1      3     4
#4      1      7     6
#5      1      4     5

答案 2 :(得分:1)

找到我自己的解决方案:创建一个包含列的元组并对其进行排名。 不会处理不同的升序/降序,但这对我的问题有好处。

df['rank'] = df[['col_a','col_b']].apply(tuple, 1).rank()

答案 3 :(得分:1)

使用numpy的{​​{3}}方法。

df = pd.DataFrame({'col_a':[0,0,0,1,1,1], 'col_b':[5,2,8,3,7,4]})
df["rank"] = np.argsort(
              df.values.copy().view(dtype=[('x', int), ('y', int)]).flatten(),  
              order=("x","y")
             ) + 1


    col_a   col_b   rank
0   0        5       2
1   0        2       1
2   0        8       3
3   1        3       4
4   1        7       6
5   1        4       5