如何根据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
答案 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