如何用Pandas重塑含重复条目的DataFrame?解决pivot报错
解决Pandas Pivot时重复索引报错的问题
问题背景
我有如下结构的DataFrame:
date nom_de_produit vl nbre_part actif_net_part collecte 4419404 2009-12-15 AIS SCHELCHER EQUITY CONVICTIONS 8,601.13 1,772.00 15.24 15.24 1711479 2009-12-15 AIS SCHELCHER EQUITY CONVICTIONS 24.42 16,535,219.00 403.79 403.79 4419403 2009-12-16 AIS SCHELCHER EQUITY CONVICTIONS 8,698.79 1,772.00 15.41 0.00 1711478 2009-12-16 AIS SCHELCHER EQUITY CONVICTIONS 24.70 16,532,917.00 408.36 -0.06 4419402 2009-12-17 AIS SCHELCHER EQUITY CONVICTIONS 8,608.85 1,772.00 15.25 0.00 ... ... ... ... ... ... ... 4490513 2023-09-07 FEDERAL INDICIEL APAL 292,228.55 9.00 2.63 0.00 1551271 2023-09-08 FEDERAL INDICIEL JAPON 268.70 269,261.00 72.35 0.00 4501848 2023-09-08 FEDERAL INDICIEL JAPON 130,979.00 0.00 0.00 0.00 13857662 2023-09-08 FEDERAL INDICIEL JAPON 130.67 42,933.00 5.61 0.00 13859487 2023-09-08 FEDERAL INDICIEL JAPON 165.40 1,135.00 0.19 0.00
想要将其重塑为以date为索引、nom_de_produit为列名,vl、nbre_part、actif_net_part、collecte为对应值的结构,使用了以下代码:
pivoted = df.pivot(index="date", columns= 'nom_de_produit', values=['vl', 'nbre_part', 'actif_net_part', 'collecte'])
但出现报错:
ValueError: Index contains duplicate entries, cannot reshape
报错核心原因
同一个date + nom_de_produit的组合对应了多行数据,而pivot要求索引+列的组合必须唯一,无法自动确定要保留哪一行的值,因此抛出错误。
解决方法
方法1:用pivot_table做聚合处理
如果重复行是需要合并的业务数据(比如求和、取均值),可以使用pivot_table,它支持对重复项执行聚合操作:
# 先处理带逗号的数值列,转换为可计算的数值类型 numeric_cols = ['vl', 'nbre_part', 'actif_net_part', 'collecte'] df[numeric_cols] = df[numeric_cols].apply(lambda x: x.str.replace(',', '').astype(float)) # 以求和为例,可根据需求替换为'mean'/'max'/'first'等聚合函数 pivoted = df.pivot_table(index="date", columns='nom_de_produit', values=['vl', 'nbre_part', 'actif_net_part', 'collecte'], aggfunc='sum')
方法2:先去重再执行pivot
如果重复行是冗余数据,只需要保留每组date+nom_de_produit的指定行,可先去重:
# 保留每组的第一行,可将keep参数换成'last'保留最后一行 df_unique = df.drop_duplicates(subset=['date', 'nom_de_produit'], keep='first') # 再执行pivot操作 pivoted = df_unique.pivot(index="date", columns='nom_de_produit', values=['vl', 'nbre_part', 'actif_net_part', 'collecte'])
内容的提问来源于stack exchange,提问作者Jacques
相关产品推荐
相关产品推荐

