Pandas计算NFL四分卫(QB)平均体重结果异常偏高问题排查
排查NFL四分卫(QB)平均体重异常偏高的问题
以下是从数据处理全流程入手的排查步骤及对应代码,帮你定位问题根源:
1. 检查数据合并逻辑是否出错
合并时的关联键(如球员ID、姓名+选秀年份)不唯一或匹配错误,是导致数据重复、错位的常见原因。
# 输出合并前后的行数变化,判断是否有异常膨胀 print(f"脑震荡数据行数: {len(concussion_data)}") print(f"Combine数据行数: {len(combine_data)}") merged_data = pd.merge(concussion_data, combine_data, on='player_id', how='inner') print(f"合并后数据行数: {len(merged_data)}") # 检查QB分组的重复记录 qb_data = merged_data[merged_data['position'] == 'QB'] print(f"QB数据总行数: {len(qb_data)}") print(f"唯一QB球员数量: {qb_data['player_id'].nunique()}")
如果QB总行数远大于唯一球员数,说明存在重复合并,可通过drop_duplicates()去重,或增加更精准的合并键(如on=['player_id', 'draft_year'])。
2. 排查QB体重数据的异常值
正常QB体重普遍在210-250磅区间,先检查是否存在离谱的异常值:
# 输出QB体重的描述统计 print(qb_data['weight'].describe()) # 绘制箱线图可视化异常值 import seaborn as sns import matplotlib.pyplot as plt sns.boxplot(x=qb_data['weight']) plt.title('QB体重分布箱线图') plt.show() # 筛选体重超过300磅的可疑记录 outliers = qb_data[qb_data['weight'] > 300] print(outliers[['player_name', 'weight', 'position']])
若存在异常值,需确认这些记录的位置标注是否正确,或是否为体重输入错误,直接清洗掉此类数据即可。
3. 验证位置分组的准确性
确认合并后的数据中,QB位置的标注未被错误覆盖或混淆:
# 查看所有位置的分布情况 print(merged_data['position'].value_counts()) # 随机抽查QB记录的核心信息 print(qb_data.sample(10)[['player_name', 'position', 'weight', 'height']])
如果发现其他位置球员混入QB分组,说明数据源的位置字段存在错误,或合并时未处理同名字段(如两个数据集都有position,需指定后缀区分:suffixes=('_concussion', '_combine'))。
4. 隔离验证Combine数据源的QB均值
单独计算Combine数据中的QB体重均值,排除脑震荡数据的干扰:
# 单独统计Combine数据的QB平均体重 combine_qb_mean = combine_data[combine_data['position'] == 'QB']['weight'].mean() print(f"Combine原始数据QB平均体重: {combine_qb_mean:.1f}磅") # 对比合并后的QB平均体重 merged_qb_mean = merged_data[merged_data['position'] == 'QB']['weight'].mean() print(f"合并后QB平均体重: {merged_qb_mean:.1f}磅")
若两者差异极大,说明合并过程引入错误;若均值一致,则问题出在Combine数据源本身(如混入其他位置球员)。
修正代码示例(以重复合并问题为例)
# 先对两个数据集按球员ID去重 concussion_data_clean = concussion_data.drop_duplicates(subset='player_id', keep='first') combine_data_clean = combine_data.drop_duplicates(subset='player_id', keep='first') # 精准合并数据 merged_data_clean = pd.merge(concussion_data_clean, combine_data_clean, on='player_id', how='inner') # 重新计算各位置的身高体重均值 position_means = merged_data_clean.groupby('position').agg({'height': 'mean', 'weight': 'mean'}).round(1) print(position_means) # 绘制对比图表 position_means.plot(kind='bar', figsize=(10, 6)) plt.title('NFL各位置球员身高体重均值对比') plt.ylabel('数值') plt.xlabel('位置') plt.show()
内容的提问来源于stack exchange,提问作者Glaikit7
相关产品推荐
相关产品推荐

