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

如何使用df.loc[]处理多行数据并应用padding转换函数?解决TypeError报错

批量应用自定义停用词占比函数到DataFrame列的解决方案

嘿,我来帮你搞定这个问题!你现在的需求是把自定义的停用词占比计算函数应用到df["Text_str"]的所有行,同时解决遇到的TypeError报错,下面是一步步的解决方法:

首先:搞定报错的根源

你碰到的TypeError: expected string or bytes-like object,90%的概率是df["Text_str"]列里混了非字符串类型的数据(比如NaN空值、数字或者其他格式),导致re.findall没法处理。先把列统一转成字符串格式:

# 把列转为字符串,同时把NaN替换成空字符串,避免后续报错
df["Text_str"] = df["Text_str"].astype(str).fillna("")

然后:优化你的计算函数

你的原函数有个小问题:每次调用都下载停用词,效率极低!我们把停用词的下载和加载移到函数外面,只执行一次:

import nltk
import re
from nltk.corpus import stopwords

# 只下载一次英文停用词,重复下载纯纯浪费时间
nltk.download('stopwords')
# 提前加载停用词集合,查询更快
english_stopwords = set(stopwords.words('english'))

def calculate_stopword_percentage(text):
    # 提取文本里所有由字母组成的单词
    words = re.findall('[A-z]+', text)
    # 处理空文本的情况,避免除以0报错
    if not words:
        return 0.0
    # 统计停用词的数量
    stopword_count = sum(1 for word in words if word.lower() in english_stopwords)
    # 计算占比并保留两位小数
    return round(stopword_count / len(words), 2)

(我把函数名改成了更直观的calculate_stopword_percentage,你要是习惯原来的padding也可以改回去~)

最后:批量应用到整个列

用pandas的apply方法直接处理整个列,结果会自动生成一个新的Series,你可以把它作为新列加到原DataFrame里:

# 新增一列存储每一行的停用词占比
df["stopword_percentage"] = df["Text_str"].apply(calculate_stopword_percentage)

验证一下结果

你可以随便选几行测试,确保结果正确:

# 测试第1行的结果
print(df.loc[1, "stopword_percentage"])
# 查看前5行的文本和对应占比
print(df[["Text_str", "stopword_percentage"]].head())

额外加速技巧(可选)

如果你的数据集特别大,apply可能有点慢,可以试试swifter库,它会自动判断用普通apply还是向量化方式加速:

# 先安装:pip install swifter
import swifter

df["stopword_percentage"] = df["Text_str"].swifter.apply(calculate_stopword_percentage)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:02:30