如何对 python 中不同列表中同一位置的每个项目进行排名?
How to rank each item at the same location across different lists in python?
我是 R 程序员,但需要使用 python 在 table 中获得排名。假设我有一个包含数字列表列表的“测试”列:
df = pd.DataFrame({"test":[[1,4,7], [4,2,6], [3,8,1]]})
我希望对行(列表)中相同位置的每个项目进行排名,并对所有排名进行平均以获得最终分数:
预计:
test rank_list final_score
0 [1, 4, 7] [1, 2, 3] 2
1 [4, 2, 6] [3, 1, 2] 2
2 [3, 8, 1] [2, 3, 1] 2
我知道所有最终分数都相同不是一个好例子,但有数百行,结果会有所不同。我希望我把问题描述清楚,如果没有,请随时提问。
不知道在pandas能不能做到,但是我试了zip + scipy,但是scipy.stats.rankdata
没有给出相同索引的item的排名:
l = list(dff["test"])
ranks_list = [scipy.stats.rankdata(x) for x in zip(*l)] # not right
estimated_rank = [sum(x) / len(x) for x in ranks_list]
我接受任何类型的包裹,以方便为准。谢谢!
import numpy as np
# Create a numpy array
a = np.array([[1,4,7], [4,2,6], [3,8,1]])
# get the index of the sorted array along each row
# Python uses zero-based indexing so we add 1
rank_list = np.argsort(a, axis=0) + 1
# calculate the average rank of each column
final_score = np.mean(rank_list, axis=1)
您可以使用rank
方法来获取排名。然后使用 agg
将输出作为列 rank_list
的列表。最后,mean
for final_score
:
tmp = pd.DataFrame(df['test'].tolist()).apply('rank').astype(int)
df['rank_list'] = tmp.agg(list, axis=1)
df['final_score'] = tmp.mean(axis=1)
输出:
test rank_list final_score
0 [1, 4, 7] [1, 2, 3] 2.0
1 [4, 2, 6] [3, 1, 2] 2.0
2 [3, 8, 1] [2, 3, 1] 2.0
我是 R 程序员,但需要使用 python 在 table 中获得排名。假设我有一个包含数字列表列表的“测试”列:
df = pd.DataFrame({"test":[[1,4,7], [4,2,6], [3,8,1]]})
我希望对行(列表)中相同位置的每个项目进行排名,并对所有排名进行平均以获得最终分数:
预计:
test rank_list final_score
0 [1, 4, 7] [1, 2, 3] 2
1 [4, 2, 6] [3, 1, 2] 2
2 [3, 8, 1] [2, 3, 1] 2
我知道所有最终分数都相同不是一个好例子,但有数百行,结果会有所不同。我希望我把问题描述清楚,如果没有,请随时提问。
不知道在pandas能不能做到,但是我试了zip + scipy,但是scipy.stats.rankdata
没有给出相同索引的item的排名:
l = list(dff["test"])
ranks_list = [scipy.stats.rankdata(x) for x in zip(*l)] # not right
estimated_rank = [sum(x) / len(x) for x in ranks_list]
我接受任何类型的包裹,以方便为准。谢谢!
import numpy as np
# Create a numpy array
a = np.array([[1,4,7], [4,2,6], [3,8,1]])
# get the index of the sorted array along each row
# Python uses zero-based indexing so we add 1
rank_list = np.argsort(a, axis=0) + 1
# calculate the average rank of each column
final_score = np.mean(rank_list, axis=1)
您可以使用rank
方法来获取排名。然后使用 agg
将输出作为列 rank_list
的列表。最后,mean
for final_score
:
tmp = pd.DataFrame(df['test'].tolist()).apply('rank').astype(int)
df['rank_list'] = tmp.agg(list, axis=1)
df['final_score'] = tmp.mean(axis=1)
输出:
test rank_list final_score
0 [1, 4, 7] [1, 2, 3] 2.0
1 [4, 2, 6] [3, 1, 2] 2.0
2 [3, 8, 1] [2, 3, 1] 2.0