我需要知道一个玩家是否在过去4.5小时内赢得了超过一半的前一场比赛(不包括当前比赛)。...rolling('4.5h')...
的变体不起作用,因为时间列不是索引,不能与set_index('game_t')
一起转换。你知道吗
游戏由gid
(游戏ID)列表示,wl
列中的“w”和“l”分别表示赢和输。每个游戏id的游戏时间都存储在game_t
我有一个数据帧,下面是一个很好的最小近似值:
df = pd.DataFrame({'game_t': [pd.datetime.now() - dt.timedelta(hours=n) for n in range(10)],
'player': [*'abacabaccb'],
'wl': ['w','l']*5,
'gid': [1,1,2,2,3,3,4,4,5,5]})
df.game_t = df.groupby('gid').game_t.transform('first')
df
# game_t player wl gid
# 0 2019-07-05 15:00:23.840588 a w 1
# 1 2019-07-05 15:00:23.840588 b l 1
# 2 2019-07-05 13:00:23.840605 a w 2
# 3 2019-07-05 13:00:23.840605 c l 2
# 4 2019-07-05 11:00:23.840611 a w 3
# 5 2019-07-05 11:00:23.840611 b l 3
# 6 2019-07-05 09:00:23.840618 a w 4
# 7 2019-07-05 09:00:23.840618 c l 4
# 8 2019-07-05 07:00:23.840623 c w 5
# 9 2019-07-05 07:00:23.840623 b l 5
看,鉴于上述情况,我需要一个专栏,称之为“bta”代表“优于平均水平”,如下所示:
# gt player wl gid bta
# 0 2019-07-05 15:00:23.840588 a w 1 True
# 1 2019-07-05 15:00:23.840588 b l 1 False
# 2 2019-07-05 13:00:23.840605 a w 2 True
# 3 2019-07-05 13:00:23.840605 c l 2 False
# 4 2019-07-05 11:00:23.840611 a w 3 True
# 5 2019-07-05 11:00:23.840611 b l 3 False
# 6 2019-07-05 09:00:23.840618 a w 4 False
# 7 2019-07-05 09:00:23.840618 c l 4 True
# 8 2019-07-05 07:00:23.840623 c w 5 False
# 9 2019-07-05 07:00:23.840623 b l 5 False
无论我在哪里尝试set_index('game_t')
,pandas都坚持索引必须是单调的。我知道game_t
列在“总是增加”或“总是减少”的意义上不是单调的,因为它有重复项,分组索引应该是单调的,因为没有玩家在给定的时间玩一次以上。*
例如,以下内容:
df['bta'] = df.groupby('player').apply(lambda g: g.set_index('game_t').wl.eq('w').rolling('4.5h', min_periods=0).mean())
结果:
Traceback (most recent call last):....pandas internals stacktrace joy... ...ValueError: index must be monotonic
无论如何,我以前的尝试都没有任何价值,因为它们要么给出了错误的答案,要么触发了典型的“你不能从这里到达那里,你甚至尝试都有点愚蠢(你尝试过使用apply
,尽管你可能是指transform
”)显示错误消息。你知道吗
*旁白:开发人员不知道“单调”是什么意思,因为它实际上意味着“不变的,或不减的,或不增的”;单调既不意味着“增加”也不意味着“减少”。它们似乎意味着“严格增加或严格减少”
我不认为你的任何问题是个问题:
game_t
不是索引:将其设置为索引game_t
不是单调的:排序它这是我的解决办法
提供:
如果愿意,可以删除这两列
is_win
。你知道吗相关问题 更多 >
编程相关推荐