如何基于Pandas对句子列文本分类生成单标签新列 现有代码报错求优化
问题说明
需要根据DataFrame中存储句子的purpose列内容,给每行打分类标签,样例数据如下:
原有代码的错误点
apply按行遍历的时候,传入自定义函数的参数row本身就是当前行的完整数据,不需要在函数内部再循环整个DataFrame的行数,逻辑完全冗余且错误- Python中逻辑或的写法错误:
'education' | 'university' in data是非法语法,|是位运算符,不能用来做字符串判断的逻辑或,应该写为'education' in data or 'university' in data - 分类逻辑有重叠,比如
real和property都属于房产相关分类,可以合并处理避免逻辑混乱
可行实现方案
方案1:修改原有自定义函数
适配apply的行遍历逻辑,修正语法错误即可运行:
def loan_cat(row): data = row['purpose'] if 'house' in data: return 'house' elif 'education' in data or 'university' in data: return 'education' elif 'wedding' in data: return 'wedding' elif 'car' in data: return 'car' elif 'real' in data: return 'real estate' elif 'property' in data: return 'property' else: return 'undefined' df['purpose_1'] = df.apply(loan_cat, axis=1)
方案2:更高效的向量化运算(推荐)
如果数据量较大,使用numpy.select的向量化运算比apply性能高很多,代码也更简洁:
import numpy as np # 按优先级定义判断条件,str.contains支持正则直接写或逻辑 conditions = [ df['purpose'].str.contains('house', na=False), df['purpose'].str.contains('education|university', na=False), df['purpose'].str.contains('wedding', na=False), df['purpose'].str.contains('car', na=False), df['purpose'].str.contains('real', na=False), df['purpose'].str.contains('property', na=False) ] # 对应条件的返回值,顺序与上方条件一一对应 choices = ['house', 'education', 'wedding', 'car', 'real estate', 'property'] # 生成分类列,不满足所有条件的默认返回undefined df['purpose_1'] = np.select(conditions, choices, default='undefined')
注:参数na=False是为了避免purpose列存在空值时抛出异常,无空值可以省略。
内容的提问来源于stack exchange,提问作者Samer Shawar
相关产品推荐
相关产品推荐

