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

Pandas分组中值相等(平局)时获取idxmax结果的方法

解决分组平局时合并高频出行方式的问题

统计基础数据

先保留你原有的统计逻辑,生成各客户出行方式的计数与占比,并筛选计数大于1的记录:

import pandas as pd

df = pd.DataFrame({'customer id':[1,1,1,2,2,2,2,2,2,2,3,3],
                   'Trans':['Car','Car','Bus','Bus','Bus','Bus','Car','Car','Car','Plane','Car','Bus']})

# 分组统计出行方式计数
df2 = df.groupby(['customer id','Trans'])['Trans'].size().reset_index(name='Trans Counts')
# 计算每组内的占比
df2['percent'] = df2.groupby("customer id")['Trans Counts'].transform(lambda x: (x / x.sum()).round(2))
# 筛选计数大于1的记录
df3 = df2[df2['Trans Counts'] > 1]

处理平局合并

通过分组遍历,对每个客户组提取最大计数的出行方式,合并平局项:

# 按客户ID分组处理平局情况
result = df3.groupby('customer id').apply(
    lambda group: pd.Series({
        'Trans': ', '.join(group[group['Trans Counts'] == group['Trans Counts'].max()]['Trans']),
        'Trans Counts': group['Trans Counts'].max(),
        'percent': group[group['Trans Counts'] == group['Trans Counts'].max()]['percent'].iloc[0]
    })
).reset_index()

# 若需要给合并项加加粗格式,修改Trans字段为:
# 'Trans': f"**{', '.join(group[group['Trans Counts'] == group['Trans Counts'].max()]['Trans'])}**",

print(result)

最终输出

运行后得到符合预期的结果:

customer id      Trans  Trans Counts  percent
0            1        Car             2     0.67
1            2  Bus, Car             3     0.43

逻辑说明

  • 利用groupby.apply()遍历每个客户组,精准定位组内计数最高的出行方式
  • 平局项的计数与占比完全一致,直接提取最大值和首个占比即可
  • 若需要格式化显示合并项(如加粗),只需在合并字符串外层添加Markdown加粗语法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:15:44