为了账号安全,请及时绑定邮箱和手机立即绑定

从最近发生的 n 次熊猫中滚出 m 次

从最近发生的 n 次熊猫中滚出 m 次

绝地无双 2021-10-19 10:30:03
我对满足条件的最后 'n' 个事件中的 'm' 次次数感兴趣,按 person 或 user 分组。具体来说,我感兴趣的是球员是否习惯在给定的级别或“类别”中打球,这取决于他们最近几场比赛(而不是任何比赛)中有多少场比赛达到或高于指定水平。我尽职尽责地从玩具数据集中分解了一组进行工作,并让我的代码在下面工作。但是,当我尝试在SeriesGroupBy对象上随意使用相同的方法链时,事情就会崩溃。首先,最简单的例子。列hc(高级)是1玩家之前 3 场比赛中有 2 场属于第 3 类。否则为 0。(我手动生成并使用了 0|1,而不是 True|False。):import pandas as pdpd.__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成功!我是熊猫黑客!我已经扬升,现在可以在潘多瑞克之路上辅导他人!首先,在我购买长袍并在修道院领取指定的婴儿床之前,让我快速检查一下:games.groupby('player').category.gt(2).rolling(3).sum().shift().gt(1)回溯(最近一次调用):文件“”,第 1 行,在文件“(无聊的路径内容)/lib/python3.6/site-packages/pandas/core/groupby/groupby.py”,第 762 行,在getattr 中 返回 self._make_wrapper(attr) 文件“(无聊的路径内容)/lib/python3.6/site-packages/pandas/core/groupby/groupby.py”,第 799 行,在 _make_wrapper 中引发 AttributeError(msg) AttributeError:无法访问“SeriesGroupBy”对象的可调用属性“gt”,尝试使用“apply”方法啊。我是暴民。这样做的好方法是什么?另外,我做错了什么?在元级别,为什么我对单个组进行操作然后泛化的策略不起作用?我确实尝试过这种apply()方式。它输出废话。
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

我最近重新审视了这个问题并找到了答案,transform(). 出于某种原因,apply()pj.dewitte的答案对 的 min_periods 参数不敏感rolling(),无论我在键入 时按键多么用力min_periods=2。


完整答案:


games['actual_hc'] = \

    games.groupby('player').category.transform(

        lambda g:

        g.gt(2).rolling(3, min_periods=2).sum().shift().gt(1)).astype(int)

#    match  category player  hc  actual_hc

# 0      a         3    bar   0          0

# 1      a         3    baz   0          0

# 2      a         3   chaz   0          0

# 3      b         2    baz   0          0

# 4      b         2   choo   0          0

# 5      b         2   chaz   0          0

# 6      c         3   chaz   0          0

# 7      c         3    foo   0          0

# 8      c         3    baz   0          0

# 9      c         3   choo   0          0

# 10     d         3    foo   0          0

# 11     d         3   char   0          0

# 12     d         3    baz   1          1

# 13     e         2   choo   0          0

# 14     e         2    foo   1          1

# 15     e         2   chaz   1          1

# 16     e         2    baz   1          1

请注意,尽管foo在她的最后一场比赛之前只进行了两场比赛,但它们都是三级,并且她被正确地报告为games.iloc[14].


查看完整回答
反对 回复 2021-10-19
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号