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()
问题原因
原代码存在两处核心问题:
- 分组后仅选中
Engage列做聚合计算,输出结果自然不会包含其他字段 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
相关产品推荐
相关产品推荐

