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

使用Lambda为DataFrame列应用函数时遇AttributeError问题求助

问题解决:AttributeError: 'str' object has no attribute 'contains'

错误原因

你用apply逐行处理DataFrame时,传入new_col函数的参数是单个字符串(或NaN值),而非pandas的Series对象。.str.contains是pandas Series专属方法,普通Python字符串没有这个属性,因此触发报错。另外代码里存在拼写错误:str.contians应改为str.contains。

修正方案1:Python原生字符串方法(适合小数据集)

将.str.contains替换为Python原生的不区分大小写匹配方式,同时修正拼写错误:

import re
import pandas as pd

def new_col(x):
    if pd.isna(x):
        return ''
    # 正则实现不区分大小写匹配
    elif re.search(r'Watch', x, re.IGNORECASE):
        return 'Product A'
    elif re.search(r'Glasses', x, re.IGNORECASE):
        return 'Product B'
    elif re.search(r'Table', x, re.IGNORECASE):
        return 'Product C'
    elif re.search(r'Computer', x, re.IGNORECASE):
        return 'Product D'
    elif re.search(r'Beauty', x, re.IGNORECASE):
        return 'Product E'
    elif ',' in x:
        return x.split(',')[0]
    else:
        return x

# 简化写法,直接对product列应用函数
df['new column'] = df['product'].apply(new_col)

如果不想用正则,也可以转小写后判断:

def new_col(x):
    if pd.isna(x):
        return ''
    x_lower = x.lower()
    if 'watch' in x_lower:
        return 'Product A'
    elif 'glasses' in x_lower:
        return 'Product B'
    elif 'table' in x_lower:
        return 'Product C'
    elif 'computer' in x_lower:
        return 'Product D'
    elif 'beauty' in x_lower:
        return 'Product E'
    elif ',' in x:
        return x.split(',')[0]
    else:
        return x

修正方案2:pandas矢量化方法(适合大数据集,效率更高)

避免逐行apply,用pandas矢量化操作搭配np.select,性能更优:

import pandas as pd
import numpy as np

# 定义匹配条件和对应结果
conditions = [
    df['product'].str.contains('Watch', case=False, na=False),
    df['product'].str.contains('Glasses', case=False, na=False),
    df['product'].str.contains('Table', case=False, na=False),
    df['product'].str.contains('Computer', case=False, na=False),
    df['product'].str.contains('Beauty', case=False, na=False),
    df['product'].str.contains(',', na=False)
]

values = [
    'Product A',
    'Product B',
    'Product C',
    'Product D',
    'Product E',
    df['product'].str.split(',').str[0]
]

# 生成新列,默认值处理NaN和其他情况
df['new column'] = np.select(conditions, values, default=df['product'].fillna(''))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:55:21