8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Python groupby 在两个不同的方向上进行排名

koppor 1月前

42 0

我有一个数据框,d:位置操作方价格Size9 9 0 1 0.7289 -168 8 0 1 0.729 -4277 7 0 1 0.7291 -2676 6 0 1 0.7292 -155 5 0 ...

我有一个数据框 d

    Position    Operation   Side    Price   Size
9   9   0   1   0.7289  -16
8   8   0   1   0.729   -427
7   7   0   1   0.7291  -267
6   6   0   1   0.7292  -15
5   5   0   1   0.7293  -16
4   4   0   1   0.7294  -16
3   3   0   1   0.7295  -426
2   2   0   1   0.7296  -8
1   1   0   1   0.7297  -14
0   0   0   1   0.7298  -37
10  0   0   0   0.7299  6
11  1   0   0   0.73    34
12  2   0   0   0.7301  7
13  3   0   0   0.7302  9
14  4   0   0   0.7303  16
15  5   0   0   0.7304  15
16  6   0   0   0.7305  429
17  7   0   0   0.7306  16
18  8   0   0   0.7307  265
19  9   0   0   0.7308  18

使用以下内容进行更新以 d 重新计算 Position

d['Position'] = d.groupby('Side')['Price'].rank().astype('int').sub(1)

但是由于每个分组的排序顺序不同 Side ,有没有办法 ascending 对一个组和 descending 另一个组进行排序?

帖子版权声明 1、本帖标题:Python groupby 在两个不同的方向上进行排名
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由koppor在本站《dataframe》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 代码

    我认为简单的解决方案是通过将组的价格乘以 -1 来对组进行排名,其中排名顺序应该反转。

    cond = d['Side'].eq(1) # you can use isin when apply to multiple group
    d['rank'] = (
        d['Price']
        .mask(cond, d['Price'].mul(-1))
        .groupby(d['Side']).rank().astype('int').sub(1)
    )
    
  • Bhas 1月前 0 只看Ta
    引用 3

    我最初考虑过这个,缺点是它只适用于数值。如果你想对字符串、日期、分类进行排序……这不会具有普遍性。

  • @mozway 提问者并不是在要求一个涵盖所有数据类型的通用答案,而且很明显,只有数字数据才能乘以 -1。

  • 是的,但局限性并不明显,因此我发表评论。请记住,我们希望答案不仅能帮助 OP,还能帮助未来的读者 ;)

  • k3b 1月前 0 只看Ta
    引用 6

    @mozway 乘以 -1 的简单解决方案将帮助未来的读者,他们会知道不能将日期或分类数据类型乘以 -1。:)

  • 此外,乘以 -1 来确定排名或排序方向是一种通用解决方案,并非特定于 Pandas,尽管它仅适用于数字类型。这对未来的读者会很有帮助。:)

  • 您可以使用 groupby.apply 来访问 group.name :

    d['rank'] = (d.groupby('Side')['Price']
                  .apply(lambda x: x.rank(ascending=x.name==0).astype('int').sub(1))
                  .droplevel(0)
                 )
    

    输出:

        Position  Operation  Side   Price  Size  rank
    9          9          0     1  0.7289   -16     9
    8          8          0     1  0.7290  -427     8
    7          7          0     1  0.7291  -267     7
    6          6          0     1  0.7292   -15     6
    5          5          0     1  0.7293   -16     5
    4          4          0     1  0.7294   -16     4
    3          3          0     1  0.7295  -426     3
    2          2          0     1  0.7296    -8     2
    1          1          0     1  0.7297   -14     1
    0          0          0     1  0.7298   -37     0
    10         0          0     0  0.7299     6     0
    11         1          0     0  0.7300    34     1
    12         2          0     0  0.7301     7     2
    13         3          0     0  0.7302     9     3
    14         4          0     0  0.7303    16     4
    15         5          0     0  0.7304    15     5
    16         6          0     0  0.7305   429     6
    17         7          0     0  0.7306    16     7
    18         8          0     0  0.7307   265     8
    19         9          0     0  0.7308    18     9
    
返回
作者最近主题: