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

