pandas如何按列顺序迭代筛选满足列值条件的行
直白易懂的暴力实现方案
这个方案完全按照你描述的逻辑逐行实现,没有用复杂的pandas高级技巧,每一步都可以单独打印看结果,好理解好修改,哪怕效率不是最高也完全符合你的需求。
实现思路
完全贴合你提的筛选规则一步步走:
- 固定按
A→B→C的顺序遍历列 - 维护一个「未被选中过的行」的集合,每轮只在这个集合里做筛选,避免重复选行
- 每轮筛选两个硬条件:
- 当前遍历的列值为1
- 这轮之前已经遍历过的所有列,在该行的值全不为1
- 每轮筛到的行单独存起来,同时把这些行从「未被选中」的集合里删掉,再进入下一轮遍历
完整可运行代码
import pandas as pd # 构造你给出的示例DataFrame df = pd.DataFrame({ 'A': [0, 0], 'B': [0, 1], 'C': [1, 1] }) # 固定列的遍历顺序,之后要改顺序直接改这个列表就行 col_traverse_order = ['A', 'B', 'C'] # 存每一轮的筛选结果 round_results = [] # 标记哪些行还没被选中,初始状态所有行都待筛选 not_selected = pd.Series([True] * len(df), index=df.index) for round_idx, current_col in enumerate(col_traverse_order): # 先取出当前还没被选的所有行 available_rows = df[not_selected] # 条件1:当前列的值等于1 meet_current_col_1 = available_rows[current_col] == 1 # 条件2:所有前置遍历过的列值都不为1 prev_cols = col_traverse_order[:round_idx] if len(prev_cols) == 0: # 遍历第一列的时候没有前置列,条件2默认全部满足 meet_prev_all_0 = pd.Series([True] * len(available_rows), index=available_rows.index) else: # 逐行检查所有前置列,全不等于1才符合要求 meet_prev_all_0 = (available_rows[prev_cols] != 1).all(axis=1) # 两个条件同时满足的行就是本轮要选的结果 current_round_selected = available_rows[meet_current_col_1 & meet_prev_all_0] # 把本轮结果存起来,标注是哪一列筛出来的 round_results.append( (current_col, current_round_selected) ) # 把本轮选中的行标记为已选,下一轮不再参与筛选 not_selected.loc[current_round_selected.index] = False # 打印结果验证 for col_name, selected_rows in round_results: print(f"遍历列{col_name}筛选结果:") print(selected_rows) print("-"*30)
运行结果
和你预期的逻辑完全匹配:
遍历列A筛选结果: Empty DataFrame Columns: [A, B, C] Index: [] ------------------------------ 遍历列B筛选结果: A B C 1 0 1 1 ------------------------------ 遍历列C筛选结果: A B C 0 0 0 1 ------------------------------
补充说明
这个写法没有做任何性能优化,所有判断都是直白直译你的需求,你可以在每一步加print打印中间结果,很容易调试。如果之后要加新列、改遍历顺序,只需要修改col_traverse_order列表即可,不需要动核心逻辑。
内容的提问来源于stack exchange,提问作者user3014653
相关产品推荐
相关产品推荐

