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

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]}")

修正说明

  1. 无序列去重:通过tuple(sorted(combo))将所有组合转为有序元组,确保A,B和B,A被识别为同一键,彻底避免重复统计
  2. 无效组合排除:itertools.combinations生成的组合天然不含重复元素,直接排除了A,A这类不符合要求的组合
  3. 计数逻辑优化:data[list(combo)].all(axis=1)准确筛选出组合内所有列值为1的行,用len(valid_rows)替代shape[0],逻辑更直观清晰

内容的提问来源于stack exchange,提问作者Sorasak Sai-in

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:22:35