Python:基于多条件修改DataFrame中FieldPosition列值
解决DataFrame填充FieldPosition的实现方案
核心规则梳理
- 单团队配额:1个
Front、2个Back、1个Middle - 固定映射关系:
Striker→Front,Defender→Back,Midfielder→Middle - 处理目标:为
Position列值为Fill且FieldPosition为None的行,按团队配额缺口补充对应值
具体实现代码(函数+循环+条件逻辑)
import pandas as pd def fill_field_position(df): # 定义团队配额和固定映射 team_quota = {'Front': 1, 'Back': 2, 'Middle': 1} pos_mapping = {'Striker': 'Front', 'Defender': 'Back', 'Midfielder': 'Middle'} # 先处理非Fill的行,确保映射正确 df.loc[df['Position'] != 'Fill', 'FieldPosition'] = df.loc[df['Position'] != 'Fill', 'Position'].map(pos_mapping) # 遍历每个团队 for team in df['Team'].unique(): # 统计当前团队已有的各FieldPosition数量 current_counts = df[df['Team'] == team]['FieldPosition'].value_counts().to_dict() # 计算每个FieldPosition的缺口 gaps = {fp: quota - current_counts.get(fp, 0) for fp, quota in team_quota.items()} # 获取当前团队需要填充的行索引 fill_rows_idx = df[(df['Team'] == team) & (df['Position'] == 'Fill') & (df['FieldPosition'].isna())].index # 按缺口依次填充对应FieldPosition fill_idx = 0 for fp, gap in gaps.items(): if gap <= 0: continue df.loc[fill_rows_idx[fill_idx:fill_idx+gap], 'FieldPosition'] = fp fill_idx += gap return df # 示例使用 sample_data = { 'Team': ['TeamA', 'TeamA', 'TeamA', 'TeamA', 'TeamA', 'TeamB', 'TeamB', 'TeamB', 'TeamB', 'TeamB'], 'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Henry', 'Ivy', 'Jack'], 'Position': ['Striker', 'Defender', 'Fill', 'Fill', 'Fill', 'Midfielder', 'Fill', 'Fill', 'Fill', 'Defender'], 'FieldPosition': [None, None, None, None, None, None, None, None, None, None] } df = pd.DataFrame(sample_data) filled_df = fill_field_position(df) print(filled_df)
代码逻辑说明
- 预映射非Fill行:先把
Position不是Fill的行按固定关系填充FieldPosition,保证配额统计的基数准确。 - 团队独立处理:遍历每个团队,避免跨团队的配额干扰,适配20+团队的场景。
- 缺口计算:对比当前团队各
FieldPosition的实际数量与配额,算出需要补充的数量。 - 批量填充:针对每个团队的
Fill行,按缺口数量依次分配对应的FieldPosition,直到填满配额。
内容的提问来源于stack exchange,提问作者Eiko Takeda
相关产品推荐
相关产品推荐

