gpt4 book ai didi

python - 从 pandas 最近出现的 n 个条件中滚动 m

转载 作者:太空狗 更新时间:2023-10-30 01:36:04 25 4
gpt4 key购买 nike

我对在满足条件的最后“n”个事件中的“m”次感兴趣,按人或用户分组。具体来说,我感兴趣的是一名球员是否习惯于在给定的级别或“类别”中打球,这取决于他们最近几场比赛(而不是任何比赛)在或高于指定水平。

我已经尽职尽责地从玩具数据集中分离出一组进行处理,并让我的代码(如下所示)开始工作。但是,当我尝试在 SeriesGroupBy 对象上随便使用相同的方法链时,事情就崩溃了。

首先,最简单的例子。当玩家之前的 3 场比赛中有 2 场比赛属于类别 3 时,hc 列(高级)为 1。否则为 0。(我手动生成并使用 0| 1,而不是 True|False。):

import pandas as pd
pd.__version__
# '0.23.4'
match = ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c',
'c', 'c', 'd', 'd', 'd', 'e', 'e', 'e', 'e']
category = [3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2]
player = ['bar', 'baz', 'chaz', 'baz', 'choo', 'chaz', 'chaz', 'foo',
'baz', 'choo', 'foo', 'char', 'baz', 'choo', 'foo', 'chaz', 'baz']
hc = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1]
games = pd.DataFrame({'match': match, 'category': category, 'player': player, 'hc': hc})
games

# match category player hc
# 0 a 3 bar 0
# 1 a 3 baz 0
# 2 a 3 chaz 0
# 3 b 2 baz 0
# 4 b 2 choo 0
# 5 b 2 chaz 0
# 6 c 3 chaz 0
# 7 c 3 foo 0
# 8 c 3 baz 0
# 9 c 3 choo 0
# 10 d 3 foo 0
# 11 d 3 char 0
# 12 d 3 baz 1
# 13 e 2 choo 0
# 14 e 2 foo 1
# 15 e 2 chaz 1
# 16 e 2 baz 1

由于我之前长时间的努力而受阻,我采用了(显然很幼稚的)策略,即分出一个有趣的玩家并让计算适用于拆分组:

baz = games.groupby('player').get_group('baz')
baz

# match category player hc
# 1 a 3 baz 0
# 3 b 2 baz 0
# 8 c 3 baz 0
# 12 d 3 baz 1
# 16 e 2 baz 1

result = baz.category.gt(2).rolling(3).sum().shift().gt(1)
result

# 1 False
# 3 False
# 8 False
# 12 True
# 16 True
# Name: category, dtype: bool

成功了!我是 Pandas 黑客!我已经扬升,现在可以用潘多瑞克之道辅导其他人了!在我购买长袍并在修道院领取指定的婴儿床之前,让我先快速检查一下:

games.groupby('player').category.gt(2).rolling(3).sum().shift().gt(1)

Traceback (most recent call last): File "", line 1, in File "(boring path stuff)/lib/python3.6/site-packages/pandas/core/groupby/groupby.py", line 762, in getattr return self._make_wrapper(attr) File "(boring path stuff)/lib/python3.6/site-packages/pandas/core/groupby/groupby.py", line 799, in _make_wrapper raise AttributeError(msg) AttributeError: Cannot access callable attribute 'gt' of 'SeriesGroupBy' objects, try using the 'apply' method

呃。我是乌合之众。

执行此操作的好方法是什么?另外,我做错了什么?在元层面上,为什么我对单个群体进行操作然后进行概括的策略不起作用?我确实尝试了 apply() 方式。它输出废话。

编辑:apply() 可能的答案:

games['actual_hc'] =
games.groupby('player').category.apply(lambda x: x.shift().gt(2).rolling(3).sum().fillna(0, downcast='infer').astype(int).gt(1))
games

# match category player hc actual_hc
# 0 a 3 bar 0 False
# 1 a 3 baz 0 False
# 2 a 3 chaz 0 False
# 3 b 2 baz 0 False
# 4 b 2 choo 0 False
# 5 b 2 chaz 0 False
# 6 c 3 chaz 0 False
# 7 c 3 foo 0 False
# 8 c 3 baz 0 False
# 9 c 3 choo 0 False
# 10 d 3 foo 0 False
# 11 d 3 char 0 False
# 12 d 3 baz 1 True
# 13 e 2 choo 0 False
# 14 e 2 foo 1 True
# 15 e 2 chaz 1 True
# 16 e 2 baz 1 True

这在我实际的 25 万行 DataFrame 上大约需要 12 秒。如果有的话,我仍然会喜欢更快的东西,只是为了知道“正确的方法”。

最佳答案

使用应用:

games.groupby('player').apply(
lambda group: group.category.gt(2).rolling(3).sum().shift().gt(1)
)

这个输出:

player    
bar 0 False
baz 1 False
3 False
8 False
12 True
16 True
char 11 False
chaz 2 False
5 False
6 False
15 True
choo 4 False
9 False
13 False
foo 7 False
10 False
14 False
Name: category, dtype: bool

这似乎是你想要的。

我不知道这是否在性能方面是最好的,但由于错误提示使用 apply,我猜 pandas 的开发人员认为这是个好主意。

关于python - 从 pandas 最近出现的 n 个条件中滚动 m,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54338923/

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