Pandas:在大型体育数据集中查询跨/同赛季换赛区的运动员
用Pandas筛选两类更换赛区的运动员数据
我正在处理一份超70万行的体育数据集,每行对应运动员某年度联赛赛季的表现,需要筛选出两类更换赛区的运动员相关记录:
- 单赛季内更换赛区的记录
- 存在跨赛季更换赛区(或单赛季更换)的运动员的全部记录
示例数据集
Id Name Division Year ------------------------------- 01 Edgar D2 2015 01 Edgar D1 2016 01 Edgar D1 2017 01 Edgar D2 2018 02 Charlie D2 2015 02 Charlie D2 2016 02 Charlie D1 2016 02 Charlie D1 2017 02 Charlie D1 2018 03 Will D2 2015 03 Will D1 2015 03 Will D1 2016 03 Will D1 2017 03 Will D2 2018 04 Frank D2 2015 04 Frank D2 2016 04 Frank D1 2016 04 Frank D2 2017 04 Frank D1 2017 04 Frank D2 2018
预期输出
1. 单赛季内更换赛区的记录
Id Name Division Year ------------------------------- 02 Charlie D2 2016 02 Charlie D1 2016 03 Will D2 2015 03 Will D1 2015 04 Frank D2 2016 04 Frank D1 2016 04 Frank D2 2017 04 Frank D1 2017
2. 跨赛季更换赛区的运动员全部记录
Id Name Division Year ------------------------------- 01 Edgar D2 2015 01 Edgar D1 2016 01 Edgar D1 2017 01 Edgar D2 2018 02 Charlie D2 2015 02 Charlie D2 2016 02 Charlie D1 2016 02 Charlie D1 2017 02 Charlie D1 2018 03 Will D2 2015 03 Will D1 2015 03 Will D1 2016 03 Will D1 2017 03 Will D2 2018 04 Frank D2 2015 04 Frank D2 2016 04 Frank D1 2016 04 Frank D2 2017 04 Frank D1 2017 04 Frank D2 2018
Pandas实现方案
1. 筛选单赛季内更换赛区的记录
针对大数据集,优先选择高效的分组筛选方式:
import pandas as pd # 获取所有存在单赛季多赛区的(Id, Year)组合 multi_div_groups = df.groupby(['Id', 'Year'])['Division'].nunique() multi_div_groups = multi_div_groups[multi_div_groups > 1].index # 筛选对应记录 single_season_switch = df.set_index(['Id', 'Year']).loc[multi_div_groups].reset_index()
2. 筛选存在换赛区行为的运动员全部记录
这里的换赛区行为包括单赛季更换和跨赛季更换,需先标记所有符合条件的运动员,再提取其全部记录:
import pandas as pd # 生成单赛季更换掩码 single_mask = df.groupby(['Id', 'Year'])['Division'].transform('nunique') > 1 # 生成跨赛季更换掩码(需先按运动员和年份排序) df_sorted = df.sort_values(['Id', 'Year']) cross_mask = df_sorted.groupby('Id')['Division'].transform(lambda x: x != x.shift()).fillna(False) # 生成运动员级别的掩码:只要有任一更换行为就保留所有行 athlete_mask = df.groupby('Id')['Id'].transform(lambda x: single_mask.loc[x.index].any() or cross_mask.loc[x.index].any()) # 筛选最终结果 cross_season_switch_all = df[athlete_mask]
内容的提问来源于stack exchange,提问作者d-fws
相关产品推荐
相关产品推荐

