如何修复Pandas数组真值歧义错误?附NYC SAT分数分析代码
纽约市公立学校SAT分数分析项目报错排查与修正
项目任务要求
- 创建名为best_math_schools的pandas DataFrame,包含数学平均分≥满分80%(即640分)的学校名称与average_math分数,按average_math降序排列;
- 识别三科SAT总分前十的学校,存入名为top_10_schools的DataFrame,包含学校名称与total_SAT列,按total_SAT降序排列;
- 定位total_SAT标准差最大的纽约行政区,存入名为largest_std_dev的DataFrame,以borough为索引,包含num_schools(学校数量)、average_SAT(总分均值)、std_SAT(总分标准差)三列,所有数值保留两位小数。
报错信息
The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
尝试在筛选行best_math_schools = best_math_schools[(best_math_schools['average_math'] >= 640)]末尾添加.all()或用if-else结合.any()均未解决问题。
原代码
import pandas as pd # Read in the data schools = pd.read_csv("schools.csv") # Preview the data schools.head() best_math_schools = schools[['school_name', 'average_math']] best_math_schools = best_math_schools[(best_math_schools['average_math'] >= 640)] best_math_schools = best_math_schools.sort_values(by='average_math', ascending=False) print(best_math_schools) top_10_schools = pd.DataFrame() top_10_schools['school_name'] = schools['school_name'] top_10_schools['total_SAT'] = schools['average_math'] + schools['average_reading'] + schools['average_writing'] top_10_schools = top_10_schools.sort_values(by='total_SAT', ascending=False) top_10_schools = top_10_schools.head(10) print(top_10_schools) total_SAT = pd.DataFrame() total_SAT['school_name'] = schools['school_name'] total_SAT['borough'] = schools['borough'] total_SAT['total_SAT'] = schools['average_math'] + schools['average_reading'] + schools['average_writing'] largest_std_dev = pd.DataFrame() largest_std_dev = schools.set_index('borough') columns_to_drop = ['school_name', 'percent_tested', 'building_code', 'average_math', 'average_reading', 'average_writing'] largest_std_dev = largest_std_dev.drop(columns=columns_to_drop) largest_std_dev['num_schools'] = schools.groupby('borough')['school_name'].count() largest_std_dev = largest_std_dev.drop_duplicates() largest_std_dev['average_SAT'] = total_SAT.groupby('borough')['total_SAT'].mean() largest_std_dev['average_SAT'] = round(largest_std_dev['average_SAT'], 2) largest_std_dev['std_SAT'] = total_SAT.groupby('borough')['total_SAT'].std() largest_std_dev['std_SAT'] = round(largest_std_dev['std_SAT'], 2) print(largest_std_dev)
错误原因分析
报错根源不在best_math_schools的筛选逻辑,而是在构建largest_std_dev时的索引对齐问题:
- 先将
schools设置borough为索引后删除列,此时largest_std_dev是带重复borough索引的空DataFrame; - 直接赋值分组统计的
num_schools时,分组结果是按borough唯一值排序的Series,与原DataFrame的重复索引无法正确对齐,导致后续操作触发数组真值判断歧义错误。
修正后的代码
import pandas as pd # 读取数据 schools = pd.read_csv("schools.csv") # 1. 筛选数学高分学校 best_math_schools = schools[['school_name', 'average_math']] # 直接筛选无需额外all()/any(),原逻辑本身没问题 best_math_schools = best_math_schools[best_math_schools['average_math'] >= 640].sort_values(by='average_math', ascending=False) print("Best Math Schools:\n", best_math_schools) # 2. 获取总分前十的学校 # 先计算总分列,再筛选所需字段排序取前10 schools['total_SAT'] = schools['average_math'] + schools['average_reading'] + schools['average_writing'] top_10_schools = schools[['school_name', 'total_SAT']].sort_values(by='total_SAT', ascending=False).head(10) print("\nTop 10 Schools by Total SAT:\n", top_10_schools) # 3. 找出总分标准差最大的行政区 # 直接分组计算所需统计量,一步到位 borough_stats = schools.groupby('borough').agg( num_schools=('school_name', 'count'), average_SAT=('total_SAT', 'mean'), std_SAT=('total_SAT', 'std') ).round(2) # 筛选标准差最大的行政区 largest_std_dev = borough_stats[borough_stats['std_SAT'] == borough_stats['std_SAT'].max()] print("\nBorough with Largest SAT Score Std Dev:\n", largest_std_dev)
修正说明
- best_math_schools部分:原筛选逻辑本身正确,无需添加
.all()/.any(),报错与该部分无关; - top_10_schools部分:直接在原DataFrame添加
total_SAT列,再筛选字段,简化代码逻辑; - largest_std_dev部分:使用
groupby().agg()一次性完成分组统计,避免索引对齐问题,最后直接筛选标准差最大的行即可,完全符合任务要求。
内容的提问来源于stack exchange,提问作者Dayem Riyasat
相关产品推荐
相关产品推荐

