Pandas如何查找子集与行中唯一True值对应的行索引列名元组
Pandas实现定位目标位置元组的无循环方案
完整可运行代码
import pandas as pd # 示例DataFrame df = pd.DataFrame([ [1, 1, True, False, True, True], [1, 2, True, False, True, True], [1, 3, True, False, False, True], [1, 4, True, True, True, True], [2, 1, False, False, False, True], [2, 2, True, True, True, True], [2, 3, True, True, False, True], [2, 4, True, True, True, True], [3, 1, True, True, True, True], [3, 2, True, True, True, True], [3, 3, True, True, False, True], [3, 4, True, True, True, True], [4, 1, True, True, True, True], [4, 2, True, True, True, True], [4, 3, True, True, True, True], [4, 4, True, True, True, True], ]) # 定义参数 group_cols = [0, 1] # 指定的分组列 target_cols = [2,3,4,5] # 要统计True的目标列 df_target = df[target_cols] # 计算第一类位置:分组内唯一True的位置 mask_group = pd.DataFrame(False, index=df.index, columns=target_cols) for g in group_cols: # 计算分组内每列True的总数,广播到所有行 group_sum = df.groupby(g)[target_cols].transform('sum') # 匹配规则:本身为True + 所在组该列True总数为1 mask_group |= (df_target == True) & (group_sum == 1) # 计算第二类位置:单行内唯一True的位置 row_true_cnt = df_target.sum(axis=1) mask_row = (df_target == True) & (row_true_cnt.values[:, None] == 1) # 合并结果并提取元组 final_mask = mask_group | mask_row result = list(final_mask.stack()[lambda x: x].index) print(result)
输出结果和你预期的元素完全一致,顺序可能不同:
[(3, 3), (4, 5), (14, 4)]
实现思路
- 先拆分统计范围:单独提取需要统计True的2-5列作为目标集,避免统计到不需要的分组列
- 分组匹配用
transform实现向量化计算:无需逐行遍历,直接把每组的True总数广播到组内所有行,快速匹配符合「组内唯一True」的单元格 - 单行匹配直接用行求和做广播判断:一次计算所有行的True总数,批量匹配符合「行内唯一True」的单元格
- 结果提取用
stack方法:直接把二维表转为「行索引-列名」的多级索引结构,过滤True值后直接获取目标元组,性能远高于手动遍历
内容的提问来源于stack exchange,提问作者asoundmove
相关产品推荐
相关产品推荐

