You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Pandas数组真值歧义错误?附NYC SAT分数分析代码

纽约市公立学校SAT分数分析项目报错排查与修正

项目任务要求

  1. 创建名为best_math_schools的pandas DataFrame,包含数学平均分≥满分80%(即640分)的学校名称与average_math分数,按average_math降序排列;
  2. 识别三科SAT总分前十的学校,存入名为top_10_schools的DataFrame,包含学校名称与total_SAT列,按total_SAT降序排列;
  3. 定位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时的索引对齐问题:

  1. 先将schools设置borough为索引后删除列,此时largest_std_dev是带重复borough索引的空DataFrame;
  2. 直接赋值分组统计的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)

修正说明

  1. best_math_schools部分:原筛选逻辑本身正确,无需添加.all()/.any(),报错与该部分无关;
  2. top_10_schools部分:直接在原DataFrame添加total_SAT列,再筛选字段,简化代码逻辑;
  3. largest_std_dev部分:使用groupby().agg()一次性完成分组统计,避免索引对齐问题,最后直接筛选标准差最大的行即可,完全符合任务要求。

内容的提问来源于stack exchange,提问作者Dayem Riyasat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:47:19