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

Python中DataFrame单类别单选项组合生成及评分可行性咨询

当然可以实现!我来给你一步步拆解怎么搞定这个需求,顺便解决你之前生成无效组合的问题~

首先明确下核心目标:从每个问题类别里仅选一个问题,生成所有合法组合,再给每个组合打分,最终筛选出最优选项。

第一步:先明确DataFrame结构(示例)

假设你的DataFrame是类似这样的结构(你可以直接替换成自己的字段):

import pandas as pd

data = {
    "category": ["基础概念", "基础概念", "逻辑推理", "逻辑推理", "计算应用"],
    "question": ["什么是变量?", "什么是函数?", "请推导A→B的逆否命题", "请解释逻辑与的含义", "计算2+3*4的结果"],
    "score": [8, 9, 7, 8, 9]  # 假设每个问题有预设分数,用于后续组合打分
}
df = pd.DataFrame(data)
第二步:生成每个类别仅选一项的合法组合

你之前生成所有无效组合的问题,应该是没先按类别分组就直接做了全组合。现在我们先按类别归类,再生成每个类别选项的笛卡尔积——这正好完美匹配“每个类别选一个”的要求:

from itertools import product

# 按类别分组,把每个类别下的问题(带分数)整理成列表
grouped = df.groupby("category").apply(lambda x: list(zip(x["question"], x["score"]))).to_dict()

# 生成合法组合:product会从每个类别的选项列表里各取一个元素
valid_combinations = list(product(*grouped.values()))

现在valid_combinations里的每一项都是合规的,比如:

(('什么是变量?', 8), ('请推导A→B的逆否命题', 7), ('计算2+3*4的结果', 9))

每个类别正好选了一个问题,完全符合你的场景要求!

第三步:给组合打分并筛选最优

接下来可以根据你的需求给组合打分,这里分两种常见情况:

情况1:用预设分数求和

如果打分规则是组合内所有问题的分数之和,直接计算即可:

# 计算每个组合的总分,整理成易读的格式
scored_combinations = []
for combo in valid_combinations:
    total_score = sum(score for _, score in combo)
    question_combo = [q for q, _ in combo]
    scored_combinations.append({"组合": question_combo, "总分": total_score})

# 转换成DataFrame方便排序筛选
scored_df = pd.DataFrame(scored_combinations)

# 筛选总分最高的最优组合
best_combination = scored_df.sort_values(by="总分", ascending=False).iloc[0]
print("最优组合:", best_combination["组合"])
print("最优分数:", best_combination["总分"])

情况2:自定义打分规则

如果你的打分规则不是简单求和(比如不同类别权重不同),可以自定义打分函数,比如给「基础概念」类的分数乘以1.2:

def custom_score(combo, category_weights):
    total = 0
    for (q, s), category in zip(combo, grouped.keys()):
        total += s * category_weights.get(category, 1.0)
    return total

# 定义类别权重
weights = {"基础概念": 1.2, "逻辑推理": 1.0, "计算应用": 1.1}

# 计算自定义分数并筛选最优
scored_combinations_custom = []
for combo in valid_combinations:
    question_combo = [q for q, _ in combo]
    total = custom_score(combo, weights)
    scored_combinations_custom.append({"组合": question_combo, "自定义总分": total})

scored_df_custom = pd.DataFrame(scored_combinations_custom)
best_custom = scored_df_custom.sort_values(by="自定义总分", ascending=False).iloc[0]
为什么这个方法可行?

核心逻辑是先通过groupby把每个类别的问题单独归类,再用itertools.product生成笛卡尔积——这个函数的作用就是从多个可迭代对象中各取一个元素生成组合,正好匹配“每个类别选一个”的规则,完全避免了跨类别多选的无效组合。

内容的提问来源于stack exchange,提问作者AdrianC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:04:41