如何在不聚合的情况下透视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
相关产品推荐
相关产品推荐

