如何按MarketId和SelectionId计算DataFrame中Prob的均值?
问题:按MarketId和SelectionId分组计算Prob列均值
我尝试用以下代码分组计算Prob列的均值,但未得到预期结果:
df.groupby(['MarketId', 'SelectionId', ], as_index=False)['Prob'].mean()
示例DataFrame
| Time | MarketId | SelectionId | Prob | |
|---|---|---|---|---|
| 0 | 06/01/2016 19:58:01 | 1.12211769 | 56343 | 3.3 |
| 1 | 06/01/2016 19:58:01 | 1.12211769 | 47999 | 2.34 |
| 2 | 06/01/2016 19:58:01 | 1.12211769 | 58805 | 3.8 |
| 3 | 06/01/2016 19:59:01 | 1.12211769 | 56343 | 3.2 |
| 4 | 06/01/2016 19:59:01 | 1.12211769 | 47999 | 2.3 |
| 5 | 06/01/2016 19:59:01 | 1.12211769 | 58805 | 3.8 |
| 6 | 06/01/2016 20:00:01 | 1.12211769 | 56343 | 3.2 |
| 7 | 06/01/2016 20:00:01 | 1.12211769 | 47999 | 2.34 |
| 8 | 06/01/2016 20:00:01 | 1.12211769 | 58805 | 3.8 |
| 9 | 15/06/2016 18:59:43 | 1.122271208 | 24 | 1.25 |
| 10 | 15/06/2016 18:59:43 | 1.122271208 | 15285 | 19 |
| 11 | 15/06/2016 18:59:43 | 1.122271208 | 58805 | 6.6 |
| 12 | 15/06/2016 19:01:43 | 1.122271208 | 24 | 1.26 |
| 13 | 15/06/2016 19:01:43 | 1.122271208 | 15285 | 18 |
| 14 | 15/06/2016 19:01:43 | 1.122271208 | 58805 | 6.8 |
| 15 | 15/06/2016 19:02:43 | 1.122271208 | 24 | 1.27 |
| 16 | 15/06/2016 19:02:43 | 1.122271208 | 15285 | 19 |
| 17 | 15/06/2016 19:02:43 | 1.122271208 | 58805 | 6.6 |
期望输出DataFrame
| MarketId | SelectionId | Prob | |
|---|---|---|---|
| 0 | 1.12211769 | 56343 | 3.233 |
| 1 | 1.12211769 | 47999 | 2.326 |
| 2 | 1.12211769 | 58805 | 3.8 |
| 3 | 1.122271208 | 24 | 1.26 |
| 4 | 1.122271208 | 15285 | 18.667 |
| 5 | 1.122271208 | 58805 | 6.667 |
解决方案
你的代码逻辑本身是正确的,未得到预期结果通常是两个原因导致:
1. 浮点精度问题
MarketId为浮点数时,可能存在微小的存储精度差异(比如1.12211769实际存储为1.1221176900000001),导致本该同组的记录被错误拆分。可以将MarketId转为字符串类型避免这个问题:
# 转换MarketId为字符串,消除浮点精度影响 df['MarketId'] = df['MarketId'].astype(str) # 确保SelectionId为整数类型,避免类型不一致导致的分组错误 df['SelectionId'] = df['SelectionId'].astype(int)
2. 小数位数格式问题
期望输出的均值保留了3位小数,而默认的mean()计算会返回更多小数位,需要用round(3)调整格式:
最终可用代码:
# 预处理数据类型 df['MarketId'] = df['MarketId'].astype(str) df['SelectionId'] = df['SelectionId'].astype(int) # 分组计算均值并保留3位小数 result = df.groupby(['MarketId', 'SelectionId'], as_index=False)['Prob'].mean().round(3)
执行后即可得到与期望一致的输出结果。
内容的提问来源于stack exchange,提问作者Robsmith
相关产品推荐
相关产品推荐

