Pandas DataFrame使用for循环查询各年龄最快运动员结果不全问题
问题原因
- 没有汇总存储每次循环的结果:你在for循环内部每次迭代都会覆盖
athletes_data_dict变量,没有将每个年龄的计算结果存入统一的容器,最终返回的只能是最后一次循环的输出。 - 循环遍历逻辑错误:你没有使用传入的
ages参数,而是硬编码了range(10,16),由于range是左闭右开区间,实际只会遍历10-15岁,既不支持自定义年龄输入,也会漏处理16岁的样本。 - 字段硬编码:提取成绩时写死了
"100m",如果传入其他径赛项目参数会得到错误结果。 - 字段提取方式不稳定:通过转字符串再拆分的方式取字段值很容易出问题,一旦姓名、成绩的格式有变动就会报错,直接取DataFrame行的字段值更稳妥。
修正后实现代码
import pandas as pd def find_fastest_athletes(df, distance, gender, ages): # 初始化总结果字典,用于存储所有年龄的结果 result = {} # 遍历传入的年龄列表,而非硬编码range for age in ages: # 筛选对应性别、年龄的运动员 filtered = df[(df["gender"] == gender) & (df["age"] == age)] if filtered.empty: # 无对应数据可自行调整处理逻辑,此处直接跳过 continue # 按指定项目升序排序,第一个即为最快运动员 fastest = filtered.sort_values(distance, ascending=True).iloc[0] # 组装当前年龄的运动员信息 athlete_info = { "forename": fastest["forename"], "surname": fastest["surname"], "time": str(fastest[distance]) } # 以年龄为键存入总结果 result[age] = athlete_info return result def main(filename='athletes.csv'): df = pd.read_csv(filename, index_col=0) # 所有径赛项目统一转float,适配不同项目查询需求 race_items = ["100m", "200m", "400m", "800m", "1500m"] df[race_items] = df[race_items].astype(float) # 测试调用 fastest_athletes = find_fastest_athletes(df,"100m","F",[10,11,12,13,14,15,16]) print(fastest_athletes) if __name__ == "__main__": main()
实现说明
函数开头初始化空的结果字典,每次循环处理完对应年龄的最快运动员后,直接以年龄为键、运动员信息字典为值存入总结果,最终返回的字典完全符合要求的输出格式,和示例输出一致。
内容的提问来源于stack exchange,提问作者Polina99
相关产品推荐
相关产品推荐

