如何高效匹配两个DataFrame字符串并生成对应名称列?
高效匹配Pandas DataFrame关键词的解决方案
问题说明
现有两个Pandas DataFrame:
- DataFrame 1:包含
ID和Paragraph列,其中Paragraph是由多个单词组成的字符串。 - DataFrame 2:包含
ID、Name和Words列,Words是字符串列表,Name是对应单词组的标识。
需求:为DataFrame 1添加新列Names,该列存储所有满足「Words中至少一个单词出现在对应Paragraph」的Name,要求无重复、顺序无关。
高效解决方案
方法一:展开关键词后聚合匹配
此方法通过展开关键词列,利用Pandas的内置合并与聚合操作实现,适合大数据量场景,避免Python层面的嵌套循环。
import pandas as pd # 初始化测试数据 data_1 = {'Paragraph': ['A B C D E', 'A F G H L', 'B J P Q W', 'G F D S A']} df_1 = pd.DataFrame(data_1) df_1['ID'] = df_1.index + 1 # 补充ID列 data_2 = {'Name': ['First', 'Second', 'Third', 'Fourth'], 'Words': [['A', 'F'], ['B', 'Z'], ['P', 'Q'], ['H', 'J']]} df_2 = pd.DataFrame(data_2) # 展开df2的Words列,每个单词对应一个Name df2_exploded = df_2.explode('Words') # 展开df1的Paragraph为单个单词,保留关联ID和原段落 df1_exploded = df_1.assign(Word=df_1['Paragraph'].str.split()).explode('Word') # 匹配单词并按ID聚合,去重后生成Name列表 matched = df1_exploded.merge(df2_exploded, left_on='Word', right_on='Words', how='left') result = matched.groupby('ID').agg( Paragraph=('Paragraph', 'first'), Names=('Name', lambda x: list(pd.unique(x.dropna()))) ).reset_index() print(result)
方法二:集合交集的向量化操作
此方法利用集合的快速交集运算,代码简洁直观,适合中小数据量场景,效率远高于嵌套循环。
import pandas as pd # 初始化测试数据 data_1 = {'Paragraph': ['A B C D E', 'A F G H L', 'B J P Q W', 'G F D S A']} df_1 = pd.DataFrame(data_1) df_1['ID'] = df_1.index + 1 # 补充ID列 data_2 = {'Name': ['First', 'Second', 'Third', 'Fourth'], 'Words': [['A', 'F'], ['B', 'Z'], ['P', 'Q'], ['H', 'J']]} df_2 = pd.DataFrame(data_2) # 预存df2中每个Name对应的单词集合 name_word_pairs = [(row['Name'], set(row['Words'])) for _, row in df_2.iterrows()] # 对每个Paragraph的单词集合,筛选出有交集的Name df_1['Names'] = df_1['Paragraph'].str.split().apply(set).apply( lambda para_set: [name for name, word_set in name_word_pairs if para_set & word_set] ) # 调整列顺序 df_1 = df_1[['ID', 'Paragraph', 'Names']] print(df_1)
输出结果
两种方法均会生成符合要求的结果:
ID Paragraph Names 0 1 A B C D E [First, Second] 1 2 A F G H L [First, Fourth] 2 3 B J P Q W [Second, Third, Fourth] 3 4 G F D S A [First]
内容的提问来源于stack exchange,提问作者TheAmazingDerik
相关产品推荐
相关产品推荐

