DataFrame按条件新增列报错:对象无isin属性
问题原因解析:'str'/'numpy.int64' object has no attribute 'isin'
核心原因
isin() 是 Pandas 专属的 Series/DataFrame 方法,仅能作用于 Pandas 的序列或表格对象。而当你用 apply(axis=1) 调用自定义函数时,传入函数的每一行是一个 Series,但你在函数里直接取 row['iter'] 得到的是单个元素(字符串或 numpy 整数类型)—— 这类单个标量值并没有 isin() 方法,因此触发报错。
举个对应你报错场景的示例:
import pandas as pd import numpy as np # 最小复现示例 df = pd.DataFrame({'iter': [1,2,3,4,5]}) high_risk_list = [1,3] def assign_risk(row): # 错误:row['iter']是单个numpy.int64,不是Series,没有isin方法 if row['iter'].isin(high_risk_list): return 'High' return 'Low' df['Risk_level'] = df.apply(assign_risk, axis=1) # 执行后报错
修正方案+性能优化
针对你的需求,有两种修正思路:
针对单个元素改用Python原生
in操作符
把函数里的isin()换成 Python 原生的成员判断:def assign_risk(row): if row['iter'] in high_risk_list: return 'High' # 可继续添加其他风险等级判断 return 'Low'放弃
apply,用Pandas向量化操作(强烈推荐)
你的DataFrame有500万行,apply(axis=1)是逐行循环,性能极低。改用向量化操作能大幅提升效率,比如用np.select实现多条件判断:high_risk = [...] medium_risk = [...] df['Risk_level'] = np.select( [df['iter'].isin(high_risk), df['iter'].isin(medium_risk)], ['High', 'Medium'], default='Low' )或者用
loc直接赋值:df['Risk_level'] = 'Low' df.loc[df['iter'].isin(high_risk), 'Risk_level'] = 'High' df.loc[df['iter'].isin(medium_risk), 'Risk_level'] = 'Medium'
内容的提问来源于stack exchange,提问作者kas
相关产品推荐
相关产品推荐

