Pandas如何按规则提取各位置TopN球员(含FLEX灵活位筛选需求)
Pandas 高效实现阵容配额选拔方案
核心逻辑分两步完成,全程使用pandas向量化操作,无手动遍历性能损耗,可支撑十万级以上数据秒级运算:
- 第一步:完成除FLEX外所有固定位置的配额选拔,标记已选中球员
- 第二步:从RB/WR/TE三类位置的未选中球员中,按得分取前N名作为FLEX配额人选
完整实现代码
import pandas as pd # 1. 构造原始测试数据 raw_data = { 'Player': {8: 'Darrel Williams', 2: 'Mark Ingram', 3: 'Michael Carter', 4: 'Najee Harris', 10: 'James Conner', 0: 'Buffalo Bills', 15: 'Davante Adams', 1: 'Aaron Rodgers', 5: 'Tyler Bass', 11: 'Corey Davis', 6: 'Van Jefferson', 14: 'Matt Ryan', 7: 'T.J. Hockenson', 9: 'Antonio Brown', 12: 'Alvin Kamara', 13: 'Tyler Boyd'}, 'Position': {8: 'RB', 2: 'RB', 3: 'RB', 4: 'RB', 10: 'RB', 0: 'DEF', 15: 'WR', 1: 'QB', 5: 'K', 11: 'WR', 6: 'WR', 14: 'QB', 7: 'TE', 9: 'WR', 12: 'RB', 13: 'WR'}, 'Score': {8: 24.9, 2: 18.8, 3: 16.2, 4: 15.3, 10: 13.9, 0: 12.0, 15: 11.3, 1: 10.48, 5: 9.0, 11: 8.8, 6: 6.9, 14: 1.68, 7: 0.0, 9: 0.0, 12: 0.0, 13: 0.0} } df = pd.DataFrame(raw_data).reset_index(drop=True) # 2. 定义配额规则 requirements_dictionary = {'QB': 1, 'RB': 2, 'WR': 2, 'TE': 1, 'K': 1, 'DEF': 1, 'FLEX': 2} base_quota = {k:v for k,v in requirements_dictionary.items() if k != 'FLEX'} flex_count = requirements_dictionary['FLEX'] flex_allowed_pos = {'RB', 'WR', 'TE'} # 3. 固定位置配额选拔 # 给每个位置的球员按得分降序排名 df['pos_score_rank'] = df.groupby('Position')['Score'].rank(ascending=False, method='first') # 筛选每个位置符合配额要求的球员 base_selected = df[df.apply(lambda row: row['pos_score_rank'] <= base_quota.get(row['Position'], 0), axis=1)].copy() # 标记分配位置为原始位置 base_selected['alloc_position'] = base_selected['Position'] # 4. FLEX位置选拔 # 筛选未被固定位置选中、且符合FLEX参选资格的球员 unselected_df = df[~df.index.isin(base_selected.index)] flex_selected = unselected_df[unselected_df['Position'].isin(flex_allowed_pos)]\ .sort_values('Score', ascending=False)\ .head(flex_count)\ .copy() # 标记分配位置为FLEX flex_selected['alloc_position'] = 'FLEX' # 5. 合并最终结果 final_result = pd.concat([base_selected, flex_selected], ignore_index=True)[['Player', 'Position', 'Score', 'alloc_position']] print(final_result.sort_values('alloc_position'))
运行结果示例
| Player | Position | Score | alloc_position |
|---|---|---|---|
| Buffalo Bills | DEF | 12.00 | DEF |
| Michael Carter | RB | 16.20 | FLEX |
| Najee Harris | RB | 15.30 | FLEX |
| Tyler Bass | K | 9.00 | K |
| Aaron Rodgers | QB | 10.48 | QB |
| Darrel Williams | RB | 24.90 | RB |
| Mark Ingram | RB | 18.80 | RB |
| T.J. Hockenson | TE | 0.00 | TE |
| Davante Adams | WR | 11.30 | WR |
| Corey Davis | WR | 8.80 | WR |
内容的提问来源于stack exchange,提问作者artemis
相关产品推荐
相关产品推荐

