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

DataFrame pivot报错:索引含重复项,需按Serialno筛选高值方案

解决pandas pivot_table重复索引报错并按指定列筛选数据的方法

原报错是因为team和position的组合存在重复行,导致无法直接透视。要实现按Serialno取最大值对应的points,可以先筛选出符合条件的记录,再执行透视操作,以下是两种可行方法:

方法一:排序后去重

先按分组字段排序,再保留每组中Serialno最大的第一条记录:

import pandas as pd

df = pd.DataFrame({'team': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
                   'Serialno': [1,2,2,1,1,2,2,1],
                   'position': ['G', 'G', 'F', 'F', 'G', 'G', 'F', 'F'],
                   'points': [5, 7, 7, 9, 4, 9, 9, 12]})

# 按team、position分组,组内按Serialno降序排列
sorted_df = df.sort_values(['team', 'position', 'Serialno'], ascending=[True, True, False])
# 保留每个(team, position)组合的第一条记录(Serialno最大的那条)
filtered_df = sorted_df.drop_duplicates(subset=['team', 'position'], keep='first')
# 执行透视
result = filtered_df.pivot(index='team', columns='position', values='points')
print(result)

方法二:用groupby+idxmax定位目标行

通过idxmax找到每组中Serialno最大的行索引,再筛选数据:

import pandas as pd

df = pd.DataFrame({'team': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
                   'Serialno': [1,2,2,1,1,2,2,1],
                   'position': ['G', 'G', 'F', 'F', 'G', 'G', 'F', 'F'],
                   'points': [5, 7, 7, 9, 4, 9, 9, 12]})

# 获取每个(team, position)组中Serialno最大的行的索引
max_serial_indices = df.groupby(['team', 'position'])['Serialno'].idxmax()
# 根据索引筛选目标数据
filtered_df = df.loc[max_serial_indices]
# 透视得到结果
result = filtered_df.pivot(index='team', columns='position', values='points')
print(result)

两种方法最终都会输出期望结果:

position    F    G
team        
A           7   7
B           9   9

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:11:09