对数据框在一列中升序排列,在另一列中降序排列

问题描述 投票:0回答:3

我已经找到了如何对具有多列的数据框进行排名,但前提是它们都是降序或升序,但是我希望以升序对数据框进行排名,然后如果使用第二列排序有平局按降序排列。

这就是我要找的:

点击次数 % 几率 排名
1 50 2
2 100 3
1 95 1
3 75 5
2 60 4

这是我目前拥有的:

df['Rank'] = df["点击次数"].rank(ascending=True,method="dense").astype(int)

这就是我目前所拥有的,然后我有一列基本上是“%机会”,因此100%是排名中的“最佳”。我找不到任何在“两个方向”排名的东西,所以我目前正在使用 IF 语句来检查是否有两个 Rank == 1,然后使用更多 IF 语句来解决平局,但我认为必须有一个对这些数据框进行排名的更好方法。

python pandas
3个回答
1
投票
col1=df1.sort_values(df1.columns.tolist(),ascending=[True,False]).assign(col1=range(1,df1.pipe(len)+1)).col1
df1.assign(rank=col1)

输出:

  ofhits  chance  rank
0       1      50     2
1       2     100     3
2       1      95     1
3       3      75     5
4       2      60     4

0
投票

您可以在自定义订单中使用

sort_values
,然后
numpy.argsort
:

df['Rank'] = np.argsort(df.reset_index(drop=True) # optional
                          .sort_values(by=['# of hits', '% chance'],
                                       ascending=[True, False])
                          .index)+1

注意。

reset_index
是可选的,仅当索引尚未排序时才需要它。

输出:

   # of hits  % chance  Rank
0          1        50     2
1          2       100     3
2          1        95     1
3          3        75     5
4          2        60     4

可重复输入:

df = pd.DataFrame({'# of hits': [1, 2, 1, 3, 2],
                   '% chance': [50, 100, 95, 75, 60]})

0
投票

您还可以使用

rank(method='first)

df['Rank'] = df.sort_values('% chance',ascending=False)['# of hits'].rank(method = 'first').astype(int)

或:

df[['# of hits','% chance']].mul([1,-1]).apply(tuple,axis=1).rank(method = 'dense')

输出:

   # of hits  % chance  Rank
0          1        50     2
1          2       100     3
2          1        95     1
3          3        75     5
4          2        60     4
© www.soinside.com 2019 - 2024. All rights reserved.