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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:27:05