如何检查pandas列的字符串列表元素是否存在于另一列中
问题原因
原代码无法正确匹配的核心问题是:annotation列存储的是字符串列表,而非单个字符串。原写法直接将整个列表对象作为判断主体,执行列表 in 句子字符串的逻辑,只有当句子中恰好出现和列表打印格式完全一致的字面量(比如带中括号、引号的列表文本)时才会返回Yes,完全不符合实际匹配需求。
修正代码
你的实际需求是检查annotation列表中的字符串是否存在于对应行的note_sentence文本中,根据判断规则不同可选择对应实现:
- 只要列表中任意一个字符串出现在句子中就标记为Yes
df_feature_case_notes['Exists'] = df_feature_case_notes.apply( lambda x: 'Yes' if any(anno in x['note_sentence'] for anno in x['annotation']) else 'No', axis=1 )
代码中用any()遍历当前行annotation列表的每一个字符串元素,逐个判断是否为note_sentence的子串,只要有一个元素命中就返回匹配成功。
- 需要忽略大小写做匹配
如果不需要区分英文大小写,可以将文本和匹配串统一转为小写/大写后再判断:
df_feature_case_notes['Exists'] = df_feature_case_notes.apply( lambda x: 'Yes' if any(anno.lower() in x['note_sentence'].lower() for anno in x['annotation']) else 'No', axis=1 )
- 需要列表中所有字符串都出现在句子中才标记为Yes
将代码中的any()替换为all()即可:
df_feature_case_notes['Exists'] = df_feature_case_notes.apply( lambda x: 'Yes' if all(anno in x['note_sentence'] for anno in x['annotation']) else 'No', axis=1 )
特殊情况处理
如果你的annotation列看起来是列表,但实际存储的是列表格式的字符串(比如取值为"['headache','cough']"的字符串类型,而非真正的list对象),需要先将其转换为真实列表再执行匹配,转换代码如下:
import ast df_feature_case_notes['annotation'] = df_feature_case_notes['annotation'].apply(ast.literal_eval)

内容的提问来源于stack exchange,提问作者tanmay
相关产品推荐
相关产品推荐

