【问题标题】:Pandas scoring n.lowest value of each date into a new column熊猫将每个日期的 n.lowest 值计入新列
【发布时间】:2020-08-13 21:00:50
【问题描述】:

我已经为此花费了太长时间,但这应该很容易,但是..

我有数据集:

    date    score1    score2
0   1.8.2020      10      11
1   1.8.2020      15      10
2   1.8.2020      16       7
3   2.8.2020       8       7
4   2.8.2020       2       9
5   2.8.2020       6       8
6   3.8.2020       8       3
7   3.8.2020       5       4
8   4.8.2020       1       5
9   4.8.2020       1       3
10  4.8.2020       0       5

对于每一天:我想找到该日期列“score1”值的第二低得分,并创建名为 result1 的新列,如果该行中这一天的值是第二低,则创建值为 1,否则为 0。 (如果多天得分相同,则两者都可以给 1)

例如 1.8.2020,第二低的值位于第 1 行,值为 15,该行应在“result1”列中获得 1 分。

结果应该是这样的:

    date       score1  score2  result1
0   1.8.2020      10      11        0
1   1.8.2020      15      10        1
2   1.8.2020      16       7        0
3   2.8.2020       8       7        0
4   2.8.2020       2       9        0
5   2.8.2020       6       8        1
6   3.8.2020       8       3        1
7   3.8.2020       5       4        0
8   4.8.2020       1       5        1
9   4.8.2020       1       3        1
10  4.8.2020       0       5        0

同样的逻辑也可以应用于列 score2 创建另一个列 result2。

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    这是rank的应用:

    rank = df.groupby('date')['score1'].rank(method='dense')-1
    df['result1'] = rank.eq(1).astype(int)
    

    输出:

            date  score1  score2  result1
    0   1.8.2020      10      11        0
    1   1.8.2020      15      10        1
    2   1.8.2020      16       7        0
    3   2.8.2020       8       7        0
    4   2.8.2020       2       9        0
    5   2.8.2020       6       8        1
    6   3.8.2020       8       3        1
    7   3.8.2020       5       4        0
    8   4.8.2020       1       5        1
    9   4.8.2020       1       3        1
    10  4.8.2020       0       5        0
    

    【讨论】:

    • 如果我想为第二低分配 10 分,为第三低分配 5 分,这将如何工作? @QuangHoang
    • df.groupby('date')['score1'].rank(method='dense') 为您提供原始排名。然后您可以使用map 将排名 2 映射到 10,排名 3 到 5 以及其他映射到 0。
    • 谢谢你! @黄
    • rank = df.groupby('date')['score1'].rank(method='dense') df['result1'] = rank.eq(2).astype(int) ---会做同样的事情,对吧?
    • @salanimi 没错!
    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多