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

