python - 如何从 Pandas 数据框中检索在其中一列末尾包含特定值的记录序列?

标签 python pandas dataframe

我正在使用基于事件的数据,希望仅返回按特定顺序排列的行。下面是序列和数据结构的示例。

data

我的问题是返回这样的序列,其想法是搜索 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/

相关文章:

python - 当不是每个人都有中间名时,将名字解析为名字、中间名、姓氏

python - 如何按一列进行分组并统计其他列中的类别数?

python - 需要匹配 2 个不同 pandas 数据框的 2 列(如果匹配),我们需要附加新数据

python - 列表到csv文件-AttributeError : 'str' object has no attribute 'writer'

python - 计算 pandas/python 中 df 的一列中非零数字的数量

pandas - 识别 PySpark DF ArrayType 列上运行的干净方法

python - 在 Pandas 数据框中扩展时间序列数据

python - 使用 Pandas 将列复制到文件时遇到问题

python - Julia:用数组中的字符串替换数字

Python C api 迭代模块中的类