pandas 从多列分组中获得 1 排名

标签 pandas group-by rank

是否可以做这样的事情

df = pd.DataFrame({
    "sort_by": ["a","a","a","a","b","b","b", "a"],
     "x": [100.5,200,200,500,1,2,3, 200],
     "y": [4000,2000,2000,1000,500.5,600.5,600.5, 100.5]
})
df = df.sort_values(by=["x","y"], ascending=False)

我可以按 sort_by 列排序并使用 x 和 y 查找排名(使用 y 打破平局)

所以理想的前景是

sort_by  x         y       rank
a        500       1000    1
a        200       2000    2
a        200       2000    2
a        200       100.5   3
a        100.5     4000    4
b        3         600.5   1
b        2         600.5   2
b        1         500.5   3  

最佳答案

sort_values之后检查factorize

df = df.sort_values(by=["x","y"], ascending=False)
df['rank']=tuple(zip(df.x,df.y))
df['rank']=df.groupby('sort_by',sort=False)['rank'].apply(lambda x : pd.Series(pd.factorize(x)[0])).values
df
Out[615]: 
  sort_by      x       y  rank
3       a  500.0  1000.0     1
1       a  200.0  2000.0     2
2       a  200.0  2000.0     2
7       a  200.0   100.5     3
0       a  100.5  4000.0     4
6       b    3.0   600.5     1
5       b    2.0   600.5     2
4       b    1.0   500.5     3

关于pandas 从多列分组中获得 1 排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54817317/

相关文章:

pandas - 获取 Pandas 数据框的多列(笛卡尔积)的组合?

python - 在此数据框中填充缺失值的最有效方法是什么?

mysql - 查询日期范围内所需的汽车

python - 如何跟踪玩家的排名?

python - pandas Grouper 未按预期进行上采样

pythonic方式对数据框中的重复行进行排名然后合并

php mysql 分组依据

sql - 基于累积值的排名

python - 如何为具有多个数字列的给定 pandas 数据框创建排名表?

python multiprocessing starmap vs apply_async,哪个更快?