为什么当我设置 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
我有这个代码:
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