为什么当我设置 axis=1 时 rank 函数不起作用?

Why the rank function is not working when I set axis=1?

我有这个代码:

y=pd.DataFrame({'num':[10,12,13,11,14]})

out = (y.join(y['num'].quantile([0.25,0.5,0.75,1])
         .set_axis([f'{i}Q' for i in range(1,5)], axis=0)
         .to_frame().T       
         .pipe(lambda x: x.loc[x.index.repeat(len(y))])
       .reset_index(drop=True))
       .assign(Rank=y['num'].rank(method='first'))
)
   

代码按原样运行,但没有返回我想要的。我试图对 num 进行排名,仅考虑它的行所以

10 is rank 1 because 10 <= 1Q value
12 is rank 2 **(not 3)** because 2Q <= 12 < 3Q value
13 is rank 3 **(not 4)** because 3Q <= 13 < 4Q value
11 is rank 1 **(not 2)** because 1Q <= 11 < 2Q value
14 is rank 4 **(not 5)** because 14>= Q4

我尝试更改此行:

.assign(Rank=y['num'].rank(method='first'))

至:

 .assign(Rank=y['num'].rank(axis=1,method='first'))

但是没有用。

我在这里错过了什么?

以您已有的为基础:

y = y.join(y['num'].quantile([0.25,0.5,0.75,1])
         .set_axis([f'{i}Q' for i in range(1,5)], axis=0)
         .to_frame().T       
         .pipe(lambda x: x.loc[x.index.repeat(len(y))])
       .reset_index(drop=True))

我们可以按如下方式添加 Rank 列。这个想法是将 num 列与分位数列进行比较,并获取分位数值大于 num 值的第一个列名称。碰巧每个分位数列上都有排名数字,因此我们使用它们来分配值:

y['Rank'] = (y.drop(columns='num').ge(y['num'], axis=0)
             .pipe(lambda x: x*x.columns).replace('', pd.NA)
             .bfill(axis=1)['1Q'].str[0].astype(int))

输出:

   num    1Q    2Q    3Q    4Q  Rank
0   10  11.0  12.0  13.0  14.0     1
1   12  11.0  12.0  13.0  14.0     2
2   13  11.0  12.0  13.0  14.0     3
3   11  11.0  12.0  13.0  14.0     1
4   14  11.0  12.0  13.0  14.0     4