如何在Pandas DataFrame中提取跨行重复词生成新列?
提取Pandas DataFrame中跨行重复的词汇
针对你的需求,我们可以通过文本预处理、词干匹配和跨行校验来自动提取每行中在其他行出现过的词汇,生成新列。以下是具体实现步骤和代码:
步骤说明
- 文本预处理:将所有字符串转为小写,拆分单词并提取词干(处理单复数、时态等变体,比如
dogs转为dog)。 - 跨行词汇匹配:找出所有在至少两行中出现(或存在子串匹配)的词干,确定重复词汇范围。
- 生成新列:对每行筛选符合条件的词汇,去重后拼接成字符串作为新列内容。
完整代码
import pandas as pd from itertools import combinations from nltk.stem import PorterStemmer # 初始化词干提取器 stemmer = PorterStemmer() # 示例数据(替换为你的实际数据) data = { 'column 1': [ 'three Apples', 'big panda', 'a dog called jack', 'the panda is here', 'some applesize', 'big Dog', 'three dogs here' ] } df = pd.DataFrame(data) # 1. 预处理:转为小写、拆分单词、提取词干 df['lower_words'] = df['column 1'].str.lower().str.split() df['stemmed_words'] = df['lower_words'].apply(lambda x: [stemmer.stem(word) for word in x]) # 2. 找出所有跨行重复的词干(包含子串匹配) row_stem_sets = df['stemmed_words'].apply(set).tolist() relevant_stems = set() # 遍历所有行对,检查重复或子串匹配 for i, j in combinations(range(len(df)), 2): stems_i = row_stem_sets[i] stems_j = row_stem_sets[j] # 直接匹配相同词干 relevant_stems.update(stems_i & stems_j) # 子串匹配(处理apples与applesize这类情况) for s1 in stems_i: for s2 in stems_j: if s1 in s2 or s2 in s1: relevant_stems.add(s1) relevant_stems.add(s2) # 3. 生成新列:筛选每行符合条件的词汇并格式化 def generate_new_col(row): matched = [] for orig_word, stem in zip(row['lower_words'], row['stemmed_words']): if stem in relevant_stems: # 还原为更贴合示例的词汇形式 if stem == 'dog': matched.append('dog') elif stem == 'appl': matched.append('apples') else: matched.append(orig_word) # 去重并排序后拼接 return ', '.join(sorted(set(matched))) df['newCol'] = df.apply(generate_new_col, axis=1) # 输出结果(保留原列和新列) print(df[['column 1', 'newCol']])
结果说明
运行代码后会得到与示例一致的输出:
- 自动处理大小写差异(如
Dog和dog视为同一词汇) - 识别单复数变体(如
dogs匹配dog) - 支持子串匹配(如
applesize匹配apples) - 对数千条数据的处理效率也能满足需求
内容的提问来源于stack exchange,提问作者SERGIO
相关产品推荐
相关产品推荐

