对DataFrame两列执行NLP预处理时触发KeyError错误求助
Pandas多列索引触发KeyError的解决方法
错误原因
KeyError: ('title', 'body')的本质是多列索引语法错误:
- 单列索引时,
df['body']是合法写法,因为传入的是单个列名字符串; - 但多列索引必须用列表包裹列名(
df[['title', 'body']]),而你写的df['title', 'body']会被Pandas解析成一个元组('title', 'body'),它会尝试查找名称为这个元组的列——显然你的DataFrame不存在这样的列,因此触发KeyError。
修正后的代码
1. 修正缺失值填充与类型转换
# 用列表包裹多列名,修正索引语法 gmeDateDf.loc[:, ['title', 'body']] = gmeDateDf[['title', 'body']].fillna('NaN').astype(str)
2. 对多列应用文本预处理函数
因为preprocess_text是处理单个字符串的函数,对多列应用时,有两种简洁写法:
写法一:用applymap直接遍历所有元素
gmeDateDfProcessed = gmeDateDf[['title', 'body']].applymap(preprocess_text)
写法二:对每一列单独应用apply
gmeDateDfProcessed = gmeDateDf[['title', 'body']].apply(lambda col: col.apply(preprocess_text))
可选优化:过滤填充的'NaN'字符串
当前代码填充的'NaN'字符串会被预处理成['nan'],如果需要排除这种无效内容,可以修改预处理函数:
def preprocess_text(text): if text == 'NaN': return [] tokens = word_tokenize(text.lower()) processed_tokens = [lemmatizer.lemmatize(word) for word in tokens if word.isalpha() and word not in stop_words] return processed_tokens
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

