使用loc查询返回Series而非单个值,如何提取坐标值?
解决loc返回Series无法赋值及高效生成x_to/y_to字段的问题
原代码报错原因
你直接把loc查询返回的Series赋值给单个单元格,哪怕Series里只有一个值,pandas也不允许这种操作;当处理到控球序列最后一条记录时,查询结果是空Series,直接赋值还会触发索引越界错误,所以每次都会进入except分支。
方案一:修改原循环代码提取单值
先判断查询结果是否非空,再用.iloc[0]提取Series的第一个元素:
# 初始化字段为空字符串 df['X_to'] = "" df['Y_to'] = "" for index, row in df.iterrows(): current_team = row['Team'] current_posession = row['Posession'] current_sequence = row['PosSeq'] # 获取匹配的下一条记录 match_row = df[(df['Team'] == current_team) & (df['Posession'] == current_posession) & (df['PosSeq'] == current_sequence + 1)] if not match_row.empty: df.loc[index, 'X_to'] = match_row['X_from'].iloc[0] df.loc[index, 'Y_to'] = match_row['Y_from'].iloc[0] # 无匹配时保持空字符串,无需try-except
方案二:高效分组Shift法(推荐)
iterrows在数据量大时效率极低,用groupby+shift可以一步完成需求,无需循环:
# 按球队+控球分组,把每组下一条记录的坐标移到当前行 df['X_to'] = df.groupby(['Team', 'Posession'])['X_from'].shift(-1) df['Y_to'] = df.groupby(['Team', 'Posession'])['Y_from'].shift(-1) # 把分组最后一行的NaN替换为空字符串 df[['X_to', 'Y_to']] = df[['X_to', 'Y_to']].fillna("")
这个方法利用pandas的向量化操作,性能比循环提升几个量级,逻辑也更清晰。
内容的提问来源于stack exchange,提问作者Patrick Demaerschalk
相关产品推荐
相关产品推荐

