Pandas如何筛选列表中包含指定字符串的DataFrame整列
批量筛选包含指定子串的整列
错误原因
原有筛选代码返回零散匹配值、其余位置填充NaN,核心是索引逻辑错误:直接使用单元格级别的二维布尔矩阵索引DataFrame时,pandas只会保留布尔值为True的单个单元格,其余位置自动填充NaN,无法实现整列保留的需求。
正确实现代码
针对列表存储的多个DataFrame,使用列级聚合的筛选逻辑即可,完整可运行代码如下:
import pandas as pd nm = ["Sepal.Length" ,"Sepal.Width" , "Petal.Length", "Petal.Width", "Species"] def tbl(data): data = [data[x:] + data[:x] for x in range(1, len(data)+1)] df = pd.DataFrame(data) return df df_tbl = tbl(nm) ls_comb = [df_tbl.loc[0:i] for i in range(0, len(df_tbl))] reply_pred = [i.apply(lambda x: x.str.replace('Species', 'log(Species)')) for i in ls_comb] # 核心筛选代码 target_str = "Sepal.Width" filtered_result = [ df.loc[:, df.apply(lambda col: col.str.contains(target_str, na=False).any())] for df in reply_pred ]
逻辑说明
- 单元格判断:
df.apply(lambda col: col.str.contains(target_str, na=False))生成与原DataFrame形状一致的二维布尔表,标记每个单元格是否包含目标子串 - 列级聚合:追加
.any()沿行方向聚合结果,只要某列存在任意一个匹配单元格,该列的聚合结果即为True,最终得到长度与列数相等的一维布尔筛选序列 - 列选择:
df.loc[:, 布尔序列]是pandas标准按列筛选写法,冒号表示保留所有行,布尔序列指定待保留列,会完整保留符合条件列的全部行内容,不会出现零散NaN问题。
运行结果与预期完全匹配,例如列表前两个元素的输出:
# 第一个元素(单行) 0 0 Sepal.Width # 第二个元素(两行) 0 4 0 Sepal.Width Sepal.Length 1 Petal.Length Sepal.Width
如果需要调整匹配规则,比如忽略大小写、启用正则匹配,直接给str.contains()传入对应参数即可,不需要改动整体筛选框架。
内容的提问来源于stack exchange,提问作者Emil11
相关产品推荐
相关产品推荐

