【问题标题】:Pandas rolling count frequency of specific value in columnPandas 列中特定值的滚动计数频率
【发布时间】:2021-09-02 03:54:52
【问题描述】:

我想要一个滚动计数列来跟踪列中特定值的计数。我想知道这匹马有多少次获得第一名。

这是我所拥有的一个例子

Horse Position
a 1
a 3
a 1
b 3
b 1
b 3
c 5
c 2
c 1

这就是我想要的

Horse Position Count
a 1 1
a 3 1
a 1 2
b 3 0
b 1 1
b 3 1
c 5 0
c 2 0
c 1 1

【问题讨论】:

    标签: python pandas dataframe count rolling-computation


    【解决方案1】:

    首先比较1,然后使用GroupBy.cumsum 避免apply 以提高性能:

    df["Count"] = df["Position"].eq(1).groupby(df["Horse"]).cumsum()
    

    或创建辅助列:

    df["Count"] = df.assign(new = df["Position"].eq(1)).groupby("Horse")['new'].cumsum()
    

    print (df)
      Horse  Position  Count
    0     a         1      1
    1     a         3      1
    2     a         1      2
    3     b         3      0
    4     b         1      1
    5     b         3      1
    6     c         5      0
    7     c         2      0
    8     c         1      1
    

    编辑:

    g = df.assign(new = df["Position"].eq(1)).groupby("Horse")['new']
    df["Count"] = g.cumsum()
    df['perc'] = g.transform('mean').mul(100)
    print (df)
      Horse  Position  Count       perc
    0     a         1      1  66.666667
    1     a         3      1  66.666667
    2     a         1      2  66.666667
    3     b         3      0  33.333333
    4     b         1      1  33.333333
    5     b         3      1  33.333333
    6     c         5      0  33.333333
    7     c         2      0  33.333333
    8     c         1      1  33.333333
    

    【讨论】:

    • 您知道如何添加获胜百分比列吗?
    • @Maria - 当然,添加 transform 和 mean,答案已编辑。
    • 第一次获胜的 perc 应该是 100,因为这匹马已经跑了 1 场比赛并赢得了它。第二个 perc 应该是 50 然后第三个应该是 66
    【解决方案2】:

    您可以按“马”分组,然后 .cumsum 在每个组中排名第一:

    df["Count"] = df.groupby("Horse")["Position"].apply(lambda x: x.eq(1).cumsum())
    print(df)
    

    打印:

      Horse  Position  Count
    0     a         1      1
    1     a         3      1
    2     a         1      2
    3     b         3      0
    4     b         1      1
    5     b         3      1
    6     c         5      0
    7     c         2      0
    8     c         1      1
    

    【讨论】:

    • 感谢我们的帮助 :)
    • 您知道如何添加获胜百分比列吗?
    猜你喜欢
    • 2016-06-30
    • 2019-06-14
    • 2021-04-16
    • 2021-09-02
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2023-02-08
    相关资源
    最近更新 更多