You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:27:22