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

如何在不聚合的情况下透视DataFrame并保留重复索引行?

保留重复索引的DataFrame透视方案

问题背景

你有如下结构的DataFrame:

import pandas as pd

l1 = ['a','b','c','d','a','b','c','d','e','f']
l2 = ['a1','b1','c1','d1','a1','b1','c1','d1','e1','f1']
l3 = ['a2','b2','c2','d2','a2','b2','c2','d2','e2','f2']
l4 = [1,2,3,4,5,6,7,8,9,10]
df = pd.DataFrame({'Col1':l1,'Col2':l2,'Col3':l3,'Col4':l4})

使用pivot_table()透视时,它默认会对相同索引的行做聚合(比如均值),导致每个(Col1, Col2)组合仅返回一行,无法保留原数据中重复索引的所有行:

pd.pivot_table(df,columns='Col3',values='Col4',index=['Col1','Col2'])

需求:按Col1和Col2作为索引完成透视,但不执行聚合,保留所有原始行的信息,重复索引也能逐行显示。


解决方案

方法1:pivot() + 临时索引

pivot()默认不做聚合,但要求索引+列的组合唯一,因此可以先添加临时递增索引避免冲突,透视后再移除临时索引:

# 添加临时索引列
df['temp_idx'] = range(len(df))
# 执行透视
result = df.pivot(index=['temp_idx', 'Col1', 'Col2'], columns='Col3', values='Col4')
# 移除临时索引,保留目标索引层级
result = result.droplevel('temp_idx')

方法2:crosstab() + 列表聚合+展开

通过指定聚合函数为列表,再将列表拆分为多行,实现保留所有原始值:

# 生成以列表存储多值的透视表
ct = pd.crosstab(
    index=[df['Col1'], df['Col2']],
    columns=df['Col3'],
    values=df['Col4'],
    aggfunc=list
)
# 展开列表为单独行,恢复原索引结构
result = ct.apply(pd.Series.explode).reset_index().set_index(['Col1', 'Col2'])

方法3:groupby() + 自定义透视

对每个索引分组单独执行透视,自动保留组内所有行:

def pivot_group(group):
    return group.pivot(columns='Col3', values='Col4')

result = df.groupby(['Col1', 'Col2'], group_keys=False).apply(pivot_group)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:15:15