Python多列无序列唯一组合统计计数错误求助
多列无序列唯一组合的1值行数统计修正方案
问题核心需求
统计多列的无序列唯一组合,需满足:
- 组合不考虑顺序(如
A,B与B,A视为同一组合) - 排除含重复元素的组合(如
A,A) - 覆盖单元素、两两组合、全量组合
- 统计每个组合对应行中所有元素列值为1的行数
示例数据
import pandas as pd data = pd.DataFrame({ 'A': [1, 1, 0, 1], 'B': [1, 0, 1, 1], 'C': [0, 1, 1, 1] })
典型错误代码(问题点)
以下实现的核心问题是未统一无序列的键格式,可能导致同一组合被重复统计:
from itertools import combinations cols = data.columns result = {} for k in range(1, len(cols)+1): for combo in combinations(cols, k): # 未对组合排序,无序列会被当作不同键 count = data[data[list(combo)].all(axis=1)].shape[0] result[combo] = count print(result)
期望输出
('A',): 3 ('B',): 3 ('C',): 3 ('A', 'B'): 2 ('A', 'C'): 2 ('B', 'C'): 2 ('A', 'B', 'C'): 1
修正后的代码
from itertools import combinations import pandas as pd data = pd.DataFrame({ 'A': [1, 1, 0, 1], 'B': [1, 0, 1, 1], 'C': [0, 1, 1, 1] }) result = {} cols = data.columns # 遍历所有组合长度(1到列数) for k in range(1, len(cols) + 1): # 生成无重复元素的列组合(自动排除A,A这类无效组合) for combo in combinations(cols, k): # 对组合排序,统一无序列的键格式 sorted_combo = tuple(sorted(combo)) # 筛选组合内所有列值为1的行,统计行数 valid_rows = data[data[list(combo)].all(axis=1)] count = len(valid_rows) # 写入结果(避免重复键) result[sorted_combo] = count # 按组合长度排序输出,更易阅读 for combo in sorted(result.keys(), key=len): print(f"{combo}: {result[combo]}")
修正说明
- 无序列去重:通过
tuple(sorted(combo))将所有组合转为有序元组,确保A,B和B,A被识别为同一键,彻底避免重复统计 - 无效组合排除:
itertools.combinations生成的组合天然不含重复元素,直接排除了A,A这类不符合要求的组合 - 计数逻辑优化:
data[list(combo)].all(axis=1)准确筛选出组合内所有列值为1的行,用len(valid_rows)替代shape[0],逻辑更直观清晰
内容的提问来源于stack exchange,提问作者Sorasak Sai-in
相关产品推荐
相关产品推荐

