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
相关产品推荐
相关产品推荐

