R语言如何删除数据框中转队球员的非TOT重复数据行
解决方案
直接用pandas向量化操作实现即可,不需要手写逐行遍历的for循环,运行效率远高于自定义循环逻辑,单份数据框清洗逻辑可封装为函数,5份不同年份的数据直接批量套用即可。
- 核心思路:先按球员维度标记哪些人存在赛季转会的
TOT汇总行,再按规则筛除冗余行,所有计算走pandas内置优化逻辑,单赛季十万级数据也能毫秒级处理完成。
import pandas as pd def clean_season_data(df: pd.DataFrame) -> pd.DataFrame: # 为每一行标记所属球员当赛季是否存在TOT汇总记录 df['player_has_tot'] = df['Team'].eq('TOT').groupby(df['Player']).transform('max') # 筛选规则:有TOT记录的球员仅保留TOT行,无TOT记录的球员保留全部原始行 cleaned_df = df[ ~(df['player_has_tot'] & (df['Team'] != 'TOT')) ].drop(columns='player_has_tot') return cleaned_df
代码逻辑说明:
groupby('Player').transform('max')会把每个球员分组下是否存在TOT值的布尔结果映射回每一行,季中转队的球员所有行的player_has_tot值均为True,未转会球员该值均为False- 筛选条件会精准剔除「球员有TOT汇总行、但当前行不是TOT行」的冗余记录,完全匹配要求的清洗规则
如果你的5份年度数据存储在列表中,比如year_df_list = [df_2019, df_2020, df_2021, df_2022, df_2023],可以直接批量处理:
# 批量清洗5个年份的数据集 cleaned_year_dfs = [clean_season_data(df) for df in year_df_list] # 如需拆分为单独变量直接解包即可 df_2019_c, df_2020_c, df_2021_c, df_2022_c, df_2023_c = cleaned_year_dfs
清洗完成后可以用以下逻辑校验结果正确性:
# 校验:所有存在TOT记录的球员,最终结果中应该仅保留1条TOT行 check_res = cleaned_df.groupby('Player').filter(lambda x: (x['Team'] == 'TOT').any()) print(check_res['Player'].value_counts()) # 输出所有球员计数均为1即符合预期
内容的提问来源于stack exchange,提问作者LoveMYMAth
相关产品推荐
相关产品推荐

