我正在使用基于事件的数据,希望仅返回按特定顺序排列的行。下面是序列和数据结构的示例。
我的问题是返回这样的序列,其想法是搜索 action_name 列以查找目标条目,然后返回导致目标发生的每个传球/ Action 。链接操作的方法是通过 possession_number 和 match_id,因为它们对于每个序列都是唯一的。
我可以通过使用以下代码将所有传球和进球 Action 返回到单独的数据框中来完成第一部分,但如何保留仅以进球结束的序列?
pass_goal = data.loc[data.action_name.isin(['Attacking pass accurate',
'Non attacking pass accurate','Accurate key pass','goal'])]
最佳答案
我认为有更好的方法来解决这个问题。首先,聚合到控球水平,保留 Action 并以某种方式对它们进行排序(第二
?)
posses = data.groupby('possession_number')[['second', 'action_name']].apply(lambda action: action.values.tolist()).reset_index(name='action_seq')
然后对其中的操作进行排序,并确定最后一个操作是目标的操作。
posses['ends_in_goal'] = posses.apply(lambda pos: sorted(pos['action_seq'])[-1][1] == 'goal', axis=1)
编辑:
为了澄清,apply
方法对行(在本例中为 axis=1
)上的函数求值,并将输出分配给新列。
这是带有突破的函数:
lambda pos: # Define a lambda with the row as "pos"
sorted(pos['action_seq']) # Sort the "action_seq" list of tuples by the first tuple value, "second" (see above)
[-1][1] # Get the last tuple in the sorted list of tuples, and from the last tuple, get the second value, "action_name"
== 'goal' # Return True if the "action_name" of the last tuple in the sorted list of actions for that possession is "goal"
如果您想对不同列所拥有的操作进行排序,请使用该列作为第一个元组值创建元组列表(请参阅 ['second', 'action_name']
上面。)然后从元组中的适当位置获取 action_name
的值。
关于python - 如何从 Pandas 数据框中检索在其中一列末尾包含特定值的记录序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60121724/