gpt4 book ai didi

python - 在 Pandas 数据框中找到条纹

转载 作者:太空狗 更新时间:2023-10-29 18:19:08 26 4
gpt4 key购买 nike

我有一个 Pandas 数据框如下:

time    winner  loser   stat
1 A B 0
2 C B 0
3 D B 1
4 E B 0
5 F A 0
6 G A 0
7 H A 0
8 I A 1

每一行是一个匹配结果。第一列是比赛时间,第二列和第三列包含赢家/输家,第四列是比赛的一个统计数据。

我想检测每个失败者的此统计数据的零条纹。

预期的结果应该是这样的:

time    winner  loser   stat    streak
1 A B 0 1
2 C B 0 2
3 D B 1 0
4 E B 0 1
5 F A 0 1
6 G A 0 2
7 H A 0 3
8 I A 1 0

在伪代码中,算法应该像这样工作:

  • .groupby 失败者 列。
  • 然后遍历每个失败者组的每一行
  • 在每一行中,查看 stat 列:如果它包含 0,则将上一行的 streak 值增加 0。如果不为0,则开始新的streak,即将0放入streak列。

所以 .groupby 就很清楚了。但是然后我需要某种 .apply 我可以在其中查看前一行?这就是我被困的地方。

最佳答案

您可以 apply自定义函数 f,然后是 cumsum , cumcountastype :

def f(x):
x['streak'] = x.groupby( (x['stat'] != 0).cumsum()).cumcount() +
( (x['stat'] != 0).cumsum() == 0).astype(int)
return x

df = df.groupby('loser', sort=False).apply(f)
print df
time winner loser stat streak
0 1 A B 0 1
1 2 C B 0 2
2 3 D B 1 0
3 4 E B 0 1
4 5 F A 0 1
5 6 G A 0 2
6 7 H A 0 3
7 8 I A 1 0

为了更好的理解:

def f(x):
x['c'] = (x['stat'] != 0).cumsum()
x['a'] = (x['c'] == 0).astype(int)
x['b'] = x.groupby( 'c' ).cumcount()

x['streak'] = x.groupby( 'c' ).cumcount() + x['a']

return x
df = df.groupby('loser', sort=False).apply(f)
print df
time winner loser stat c a b streak
0 1 A B 0 0 1 0 1
1 2 C B 0 0 1 1 2
2 3 D B 1 1 0 0 0
3 4 E B 0 1 0 1 1
4 5 F A 0 0 1 0 1
5 6 G A 0 0 1 1 2
6 7 H A 0 0 1 2 3
7 8 I A 1 1 0 0 0

关于python - 在 Pandas 数据框中找到条纹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35427298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com