【问题标题】:Is there a way I can track sequences in Python?有没有办法可以在 Python 中跟踪序列?
【发布时间】:2020-03-27 14:53:33
【问题描述】:

数据框包含以进球结尾的所有球队财产。每行代表一个球事件,详细说明了涉及哪些球员、动作类型以及它在球场上发生的位置。

#sample df
pass_goal = pd.DataFrame({'match_id': [1107073,1107073,1107073,1409630,1409630,1409630,1509730,1509730,1509730,1509730], 
'possession_number': [2,2,2,40,40,40,100,100,100,100], 
'second': [10,15,20,250,260,270,300,310,320,330], 
'action_name': ['pass', 'pass', 'goal','pass','pass','goal','pass','pass','pass','goal'], 
'player_name': ['a','b','b','b','a','a','d','e','c','c',]})

所以我的问题是我想跟踪每次控球发生的不同序列/流程。我尝试过但失败的一种方法是按占有 ID 计算唯一玩家。

例如控球权 2 => 球员 a 传球给球员 b,球员 b 射门得分(我想将其定义为 ABG),另一个例子可能是控球权 40 => 球员 b 传球给球员 a,球员 a 射门得分(即使球员名字不同这也应该定义为和第一个相同的序列)

显然有很多更复杂的组合,比如涉及多个播放器的 ABCDAG,但我让示例 df 尽可能简单

不确定是否有这么简单的方法,但如果可以实现,我的首选输出是

Sequence        Count
ABG               2
ABCG              1

【问题讨论】:

  • 换句话说,你不在乎顺序或控球球员的出现次数?

标签: python pandas dataframe sequence


【解决方案1】:

这里有两个不同的问题:

  1. 将单个控球的球员连接成一个唯一的字符串
  2. 转换这些字符串,使其独立于玩家姓名

第一个问题可以用 groupby 解决:

val = pd.Series(pass_goal['player_name'])
val[pass_goal['action_name'] == 'goal'] = 'G'
tmp = val.groupby(pass_goal['possession_number']).apply(lambda x: ''.join(x.tolist()))

它给出:

possession_number
2       abG
40      baG
100    decG
Name: player_name, dtype: object

如果会使用特定的函数来转换这些字符串:

def trans(s):
    resul = []
    d = {}
    for i in s:
        if i == 'G':
            resul.append(i)
        else:
            if i not in d:
                d[i] = chr(ord('A') + len(d))
            resul.append(d[i])
    return ''.join(resul)

演示:

>>> trans('abG')
'ABG'
>>> trans('baG')
'ABG'

好的,让我们应用trans和count:

tmp = tmp.apply(trans)
resul = tmp.groupby(tmp).count().rename('count').reset_index().rename(
         columns={'player_name': 'sequence'})

它按预期给出:

  sequence  count
0     ABCG      1
1      ABG      2

【讨论】:

  • 谢谢,如果 possesion_id 本身不是唯一的,我还需要按 match_id 分组,我可以在声明 tmp 的地方添加 match_id 列吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多