Python中识别DataFrame多列匹配指定列表字符串的对应值
嘿,我来帮你搞定这个需求!下面是具体的实现思路和代码示例,你可以直接套用或者根据自己的实际场景调整。
解决方案
首先我们先设定一个示例场景,方便你快速理解整个流程:
import pandas as pd # 示例多列DataFrame df = pd.DataFrame({ 'Col1': ['apple pie', 'banana bread', 'cherry tart'], 'Col2': ['orange juice', 'grape soda', 'lemon tea'], 'Col3': ['peach cobbler', 'plum jam', 'apple sauce'] }) # 预定义的目标单词列表 target_words = ['apple', 'banana', 'lemon']
方法1:提取每行第一个匹配的列值
如果你的需求是找到每行中第一个包含目标单词的列,并提取其对应值,可以用apply结合自定义函数实现:
def get_first_match(row, word_list): # 遍历当前行的所有列 for col_name in row.index: # 检查当前列的文本是否包含列表中的任意单词 if any(word in row[col_name] for word in word_list): return row[col_name] # 没有匹配项时返回空值(可根据需求改成空字符串等自定义值) return pd.NA # 新增New_var列 df['New_var'] = df.apply(get_first_match, word_list=target_words, axis=1)
运行后得到的结果:
Col1 Col2 Col3 New_var 0 apple pie orange juice peach cobbler apple pie 1 banana bread grape soda plum jam banana bread 2 cherry tart lemon tea apple sauce lemon tea
方法2:提取所有匹配的列值(拼接成字符串)
如果需要把每行中所有包含目标单词的列值都收集起来,可以修改函数逻辑,用分隔符拼接结果:
def get_all_matches(row, word_list, separator=', '): matched_values = [] for col_name in row.index: if any(word in row[col_name] for word in word_list): matched_values.append(row[col_name]) # 有匹配项就拼接,否则返回空值 return separator.join(matched_values) if matched_values else pd.NA df['New_var'] = df.apply(get_all_matches, word_list=target_words, axis=1)
此时第三行的结果会是 lemon tea, apple sauce,因为它的Col2和Col3都匹配了目标单词。
额外优化点
- 忽略大小写:如果不需要区分大小写,把检查逻辑改成:
any(word.lower() in row[col_name].lower() for word in word_list) - 精确匹配完整单词:如果你需要匹配完整单词(避免把'apple'误匹配到'applesauce'这类包含子串的情况),可以用正则表达式:
import re any(re.search(rf'\b{re.escape(word)}\b', row[col_name]) for word in word_list)
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

