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

