使用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
相关产品推荐
相关产品推荐

