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

如何在Pandas中对所有列批量应用函数实现两种行过滤需求

Pandas DataFrame 两种行过滤解决方案

先给出示例DataFrame:

import pandas as pd

df = pd.DataFrame(
    {'A': ["Bonjour (coouse); je teste", "La nuit (horrible)", "La troisième voie"],
     'B': ["La première voie", "Bonjour (coouse); ou pas", "La nuit (horrible)"]}
)

需求1:筛选任意列包含列表至少一个元素的行

目标:只要某一行的任意一列中存在目标列表里的至少一个元素,就保留该行。

实现代码

# 定义目标匹配列表
targets = ["Bonjour (coouse)", "La troisième voie"]

# 生成布尔索引:逐行检查是否有元素匹配
mask = df.apply(
    lambda row: any(target in cell for cell in row for target in targets),
    axis=1
)

# 过滤后的结果
filtered_df1 = df[mask]

代码说明

  • axis=1 指定按行遍历DataFrame
  • 内层循环逐个检查当前行的每个单元格,判断是否包含目标列表中的任意元素
  • any() 只要有一个匹配就返回True,最终生成一行对应一个布尔值的过滤索引

需求2:列表元素分别对应指定列存在的行

目标:目标列表的第N个元素必须存在于DataFrame的第N列中(比如列表第一个元素在列A,第二个在列B),只有同时满足所有列的匹配条件才保留该行。

实现代码

# 定义目标列表,顺序与列顺序对应(此处对应列A、列B)
targets = ["Bonjour (coouse)", "La nuit (horrible)"]

# 生成每个列对应的布尔条件
column_masks = [df[col].str.contains(target) for col, target in zip(df.columns, targets)]

# 合并所有条件(所有列的条件必须同时满足)
final_mask = pd.concat(column_masks, axis=1).all(axis=1)

# 过滤后的结果
filtered_df2 = df[final_mask]

代码说明

  • zip(df.columns, targets) 将列名和对应位置的目标元素一一配对
  • str.contains() 检查列中每个单元格是否包含对应目标元素(若需精确匹配,可替换为df[col] == target)
  • all(axis=1) 确保同一行的所有列条件都为True,才将该行纳入结果

内容的提问来源于stack exchange,提问作者Thomas Peyre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:20:29