如何在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
相关产品推荐
相关产品推荐

