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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:11:17