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

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)  # 执行后报错

修正方案+性能优化

针对你的需求,有两种修正思路:

  1. 针对单个元素改用Python原生in操作符
    把函数里的 isin() 换成 Python 原生的成员判断:

    def assign_risk(row):
        if row['iter'] in high_risk_list:
            return 'High'
        # 可继续添加其他风险等级判断
        return 'Low'
    
  2. 放弃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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:09:19