如何在Pandas中应用文本特征提取函数填充DataFrame列?
嘿,这个场景我太熟悉了!我来给你分享几个Pandas里高效实现的方法,比你手动逐个更新列要省心多了~
先明确你的需求核心
你需要把每个文本对应的1000个单词存在性(True/False),转换成DataFrame的1000个特征列,对吧?下面分情况给你解决方案:
方法一:简单直接的 apply + pd.Series
如果你的数据量不算特别大(比如几万行以内),这个方法最容易上手,不用额外依赖其他库:
首先假设你的提取函数是这样的(模拟你的逻辑):
def extract_features(text): # 这里是你的1000个目标单词列表 target_words = ["apple", "banana", "orange", ...] # 替换成你的实际词汇 return {word: word in text.lower() for word in target_words}
然后直接把函数应用到text列,把返回的字典转成Series,再和原DataFrame合并:
import pandas as pd # 假设你的原始DataFrame是df df = pd.DataFrame({ "text": ["I love apple pie", "Banana is my favorite", "Orange juice is fresh"], "result": [1, 0, 1] }) # 生成特征列DataFrame features_df = df["text"].apply(lambda x: pd.Series(extract_features(x))) # 合并到原DataFrame df = pd.concat([df, features_df], axis=1)
这样生成的features_df里,每个单元格就是对应单词是否出现在该行文本中的布尔值,直接合并就搞定了~
方法二:高效的CountVectorizer(推荐大规模数据)
如果你的DataFrame行数很多(比如几十万甚至更多),上面的apply逐行处理会比较慢。这时候可以用sklearn的CountVectorizer,它是专门做文本特征提取的优化工具,速度快很多:
from sklearn.feature_extraction.text import CountVectorizer # 同样是你的1000个目标单词列表 target_words = ["apple", "banana", "orange", ...] # 初始化向量器:指定词汇表,开启binary模式(只记录存在/不存在) vectorizer = CountVectorizer(vocabulary=target_words, binary=True) # 把text列转换成特征矩阵,再转成DataFrame features_df = pd.DataFrame( vectorizer.fit_transform(df["text"]).toarray(), columns=vectorizer.get_feature_names_out(), index=df.index # 保持和原DataFrame索引一致,避免合并出错 ) # 把0/1转换成布尔值(可选,看你需求) features_df = features_df.astype(bool) # 合并到原DataFrame df = pd.concat([df, features_df], axis=1)
这个方法底层是用优化过的C语言实现的,处理大规模数据的效率比apply高几个量级,非常推荐!
如果已经创建了默认False的列怎么办?
如果你已经提前创建了所有特征列(默认都是False),想要批量更新符合条件的单元格,虽然可以这么做,但不推荐(因为逐行修改DataFrame性能很差):
# 先获取每行的特征字典 features_series = df["text"].apply(extract_features) # 遍历每行更新 for idx, feature_dict in features_series.items(): # 筛选出值为True的单词 true_words = [word for word, is_present in feature_dict.items() if is_present] # 更新该行的这些列为True df.loc[idx, true_words] = True
还是建议你用前面两种方法直接生成特征列,再替换掉你原来的默认列,这样效率高得多。
内容的提问来源于stack exchange,提问作者Ala Głowacka
相关产品推荐
相关产品推荐

