如何基于两个Pandas DataFrame的词组合生成匹配标记列
解决Pandas DataFrame词组合匹配并生成标记列
1. 先还原你的两个DataFrame
import pandas as pd # 构造DataFrame A df_a = pd.DataFrame({ 'x': ['a', 'b'], 'disc': ["'tall', 'short', 'medium'", "'small', 'long', 'short'"] }) # 构造DataFrame B df_b = pd.DataFrame({ 'y': ["'tall', 'short'", "'short', 'long'", "'small', 'tall'"] })
2. 预处理数据格式
把列里的字符串形式词列表转换成集合,方便后续做包含性判断:
# 处理df_a的disc列,提取所有词并转成集合 df_a['disc_set'] = df_a['disc'].apply(lambda s: {word.strip().strip("'") for word in s.split(',')}) # 处理df_b的y列,同时生成对应的列名(用空格连接词) df_b['word_set'] = df_b['y'].apply(lambda s: {word.strip().strip("'") for word in s.split(',')}) df_b['col_name'] = df_b['y'].apply(lambda s: ' '.join([word.strip().strip("'") for word in s.split(',')]))
3. 生成标记列并合并结果
遍历df_b中的每个词组合,判断df_a的disc列是否包含该组合的所有词,是则标记1,否则标记0:
# 逐个处理每个词组合,添加新列 for idx, row in df_b.iterrows(): col_name = row['col_name'] target_words = row['word_set'] df_a[col_name] = df_a['disc_set'].apply(lambda x: 1 if target_words.issubset(x) else 0) # 移除中间辅助列,得到最终结果 final_df = df_a.drop('disc_set', axis=1)
最终输出结果
| x | disc | tall short | short long | small tall |
|---|---|---|---|---|
| a | 'tall', 'short', 'medium' | 1 | 0 | 0 |
| b | 'small', 'long', 'short' | 0 | 1 | 0 |
关键说明
- 用集合的
issubset()方法可以高效判断目标词组合是否全部包含在disc的词集合中 - 先把字符串格式的词列表转成集合,大幅简化了包含性判断的逻辑
- 列名直接用空格连接组合内的词,完全匹配你要求的格式
内容的提问来源于stack exchange,提问作者user18325356
相关产品推荐
相关产品推荐

