我想要一个滚动计数列来跟踪列中特定值的计数。我想滚动计算这匹马获得第一名的次数。
这是我所拥有的一个例子
马 | 位置 |
---|---|
一 | 1 |
一 | 3 |
一 | 1 |
b | 3 |
b | 1 |
b | 3 |
c | 5 |
c | 2 |
c | 1 |
这就是我想要的
马 | 位置 | 计数 |
---|---|---|
一 | 1 | 1 |
一 | 3 | 1 |
一 | 1 | 2 |
b | 3 | 0 |
b | 1 | 1 |
b | 3 | 1 |
c | 5 | 0 |
c | 2 | 0 |
c | 1 | 1 |
答案 0 :(得分:1)
您可以按“马”分组,然后在每个组中的第一个位置.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
答案 1 :(得分: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