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

使用Pandas apply基于GPA、SAT生成新列报TypeError错误如何解决

问题核心原因及修正方案

错误1:运算符优先级误用

& 作为位运算符优先级远高于比较运算符(>/</==等),你写的 x['GPA W'] < 2.0 & x['SAT'] < 940 会被Python优先计算 2.0 & x['SAT'],浮点数和SAT分数/NaN做位运算直接触发类型错误。
在单值条件判断(apply逐行处理的是单个标量值)场景下直接用逻辑运算符 and 即可,不需要用 &。

错误2:NaN值判断方法错误

NaN 是特殊浮点值,和任何值(包括自身)做 == 比较都会返回False,不能用 x['SAT'] == NaN 判断空值,需要用 pd.isna(x['SAT']) 兼容判断各类空值。

修正后完整代码

import pandas as pd

def f(x):
    gpa = x['GPA W']
    sat = x['SAT']
    if gpa < 2.0 and pd.isna(sat): return "2 yr"
    elif gpa < 2.0 and sat < 940: return "2 yr"
    elif gpa < 2.0 and sat >= 940 and sat <= 1050: return "Non-Selective 4 yr"
    elif gpa < 2.0 and sat >= 1060 and sat <= 1150: return "Somewhat Selective"
    elif gpa < 2.0 and sat >=1160: return "Somewhat Selective"
    elif gpa >= 2.0 and gpa <=2.4 and pd.isna(sat): return "Non-Selective 4 yr"
    elif gpa >= 2.0 and gpa <=2.4 and sat < 940: return "Non-Selective 4 yr"
    elif gpa >= 2.0 and gpa <=2.4 and sat >= 940 and sat <= 1050: return "Somewhat Selective"
    elif gpa >= 2.0 and gpa <=2.4 and sat >= 1060 and sat <= 1150: return "Somewhat Selective"
    elif gpa >= 2.0 and gpa <=2.4 and sat > 1160: return "Selective/Very Selective"
    elif gpa >= 2.5 and gpa <=2.9 and pd.isna(sat): return "Somewhat Selective"
    elif gpa >= 2.5 and gpa <=2.9 and sat < 940: return "Somewhat Selective"
    elif gpa >= 2.5 and gpa <=2.9 and sat >= 940 and sat <= 1050: return "Somewhat Selective"
    elif gpa >= 2.5 and gpa <=2.9 and sat >= 1060 and sat <= 1150: return "Selective"
    elif gpa >= 2.5 and gpa <=2.9 and sat > 1160: return "Selective/Very Selective"
    elif gpa >= 3.0 and gpa <=3.4 and pd.isna(sat): return "Selective"
    elif gpa >= 3.0 and gpa <=3.4 and sat < 940: return "Somewhat Selective"
    elif gpa >= 3.0 and gpa <=3.4 and sat >= 940 and sat <= 1050: return "Selective"
    elif gpa >= 3.0 and gpa <=3.4 and sat >= 1060 and sat <= 1150: return "Selective/Very Selective"
    elif gpa >= 3.0 and gpa <=3.4 and sat > 1160: return "Very Selective"
    elif gpa >= 3.5 and gpa <=4.0 and pd.isna(sat): return "Selective"
    elif gpa >= 3.5 and gpa <=4.0 and sat < 940: return "Selective"
    elif gpa >= 3.5 and gpa <=4.0 and sat >= 940 and sat <= 1050: return "Selective/Very Selective"
    elif gpa >= 3.5 and gpa <=4.0 and sat >= 1060 and sat <= 1150: return "Selective/Very Selective"
    elif gpa >= 3.5 and gpa <=4.0 and sat > 1160: return "Very Selective"
    else: return "Unknown"

dat['Selectivity'] = dat.apply(f, axis=1)

可选优化建议

如果数据量较大(十万行以上),可以改用pd.cut打GPA分段标签+np.select向量化判断的写法,执行性能比逐行apply高数十倍;也可以把重复的GPA范围判断提取为公共变量,降低代码冗余和写错的概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:57:02