Python Pandas如何删除DataFrame中不含列表全部元素的行
Pandas 筛选包含指定全部字母的行
问题场景
给定字母列表:
letters = ['E', 'H', 'T', 'D']
现有如下结构的DataFrame:
letter_1 letter_2 letter_3 letter_4 letter_5 word 0 D E B U T DEBUT 1 D E B U G DEBUG 2 B E G E T BEGET 3 D E P T H DEPTH 4 D U V E T DUVET
需要过滤掉所有未包含letters列表中全部元素的行,仅保留覆盖所有指定字母的行。
实现方案
因为DataFrame中已经有拼接好的word列,直接基于该列做判断是最简洁的实现方式:
import pandas as pd # --------------- 示例数据构造 --------------- df = pd.DataFrame({ 'letter_1': ['D','D','B','D','D'], 'letter_2': ['E','E','E','E','U'], 'letter_3': ['B','B','G','P','V'], 'letter_4': ['U','U','E','T','E'], 'letter_5': ['T','G','T','H','T'], 'word': ['DEBUT','DEBUG','BEGET','DEPTH','DUVET'] }) letters = ['E', 'H', 'T', 'D'] # --------------- 过滤逻辑 --------------- # 逐行判断当前单词是否包含所有指定字母 mask = df['word'].apply(lambda word: all(c in word for c in letters)) result = df[mask].reset_index(drop=True)
如果你不想依赖word列,要基于letter_1到letter_5的原始列做判断,可以用下面的写法:
# 提取所有字母列 letter_cols = [col for col in df.columns if col.startswith('letter_')] # 逐行判断所有字母列的取值是否覆盖全部指定字母 mask = df[letter_cols].apply(lambda row: all(c in row.values for c in letters), axis=1) result = df[mask].reset_index(drop=True)
运行结果
两种写法得到的过滤结果一致,最终仅保留符合要求的行:
letter_1 letter_2 letter_3 letter_4 letter_5 word 0 D E P T H DEPTH
逻辑说明
核心判断用了all()函数,只有当letters里的每一个字符都在当前行的对应内容中存在时,才会返回True,最终通过布尔索引筛选出所有符合条件的行即可。
内容的提问来源于stack exchange,提问作者rujole13
相关产品推荐
相关产品推荐

