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

Pandas按参数组合分组取Engage列众数保留全字段方法

基于智能体建模输出数据的聚合实现

场景与需求

  • 建模环境:Python/Mesa 基于智能体建模范式
  • 原始数据集属性:共25920行、11列,已按参数扫描列density、hero_prob、malevolent、tipping_point、agi_gain排序,覆盖全部参数组合
  • 参数规则:共2592种参数组合,单组参数对应10次重复实验,合计25920行原始数据
  • 聚合目标:生成适配逻辑回归训练的DataFrame,按参数组合聚合10次重复实验的行数据,最终输出2592行、11列的规整数据集,Engage列聚合规则如下:
    • 保留组内出现频次最高的取值
    • 若组内True、False各出现5次(频次持平),取值为"Tie"
  • 原有代码问题:执行以下代码时,返回结果仅包含Engage列,未保留其他参数字段,且agi_gain出现合并异常,结果结构与原DataFrame不一致
df_grouped = df_sorted.groupby(['density','hero_prob','malevolent','tipping_point','agi_gain'])['Engage'].agg(pd.Series.mode).to_frame()

问题原因

原代码存在两处核心问题:

  1. 分组后仅选中Engage列做聚合计算,输出结果自然不会包含其他字段
  2. pd.Series.mode遇到频次持平的多值场景会返回长度大于1的序列,触发groupby的异常列展开,也就是你遇到的agi_gain合并问题,且原生mode方法不支持平局标记为"Tie"的自定义规则。

可直接运行的实现代码

首先自定义Engage列的聚合函数,完全匹配规则:

import pandas as pd

def agg_engage(series: pd.Series):
    true_cnt = series.sum()
    false_cnt = len(series) - true_cnt
    if true_cnt > false_cnt:
        return True
    elif false_cnt > true_cnt:
        return False
    else:
        return "Tie"

之后按列配置聚合规则,分组时设置as_index=False避免分组列被转为索引,保证输出结构和原表完全一致:

# 配置全列聚合规则
agg_config = {}
for col in df_sorted.columns:
    if col == "Engage":
        agg_config[col] = agg_engage
    # 非分组、非Engage的列,同参数组内取值固定,取首个值即可
    elif col not in ["density", "hero_prob", "malevolent", "tipping_point", "agi_gain"]:
        agg_config[col] = "first"

# 执行分组聚合
df_grouped = df_sorted.groupby(
    by=["density", "hero_prob", "malevolent", "tipping_point", "agi_gain"],
    as_index=False
).agg(agg_config)

结果验证

最终输出的df_grouped固定为2592行、11列,和原表结构完全对齐:

  • 无多值导致的列合并异常
  • Engage列严格遵循多数优先、平局标记为"Tie"的规则
  • 所有参数列、固定属性列取值和原组数据完全一致,可直接用于后续逻辑回归建模。

提示:如果原表中存在随重复实验变动的非参数列,可根据建模需求调整对应列的聚合规则(如取均值、标准差等),替换agg_config中的"first"即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:27:25