如何将重复行转为列并分配新列名?解决pivot报KeyError问题
解决将重复行转换为列时的KeyError问题
问题场景
现有如下DataFrame df:
import pandas as pd df = pd.DataFrame(data=[['A',1],['A',2],['B',3],['C',4],['C',5],['C',6]],columns=['Name','Value'])
输出:
Name Value 0 A 1 1 A 2 2 B 3 3 C 4 4 C 5 5 C 6
想要转换为如下格式的df1:
Name 0 1 2 0 A 1.0 2.0 <NA> 1 B 3.0 <NA> <NA> 2 C 4.0 5.0 6.0
错误代码及报错
运行以下代码时触发KeyError: 3:
df.pivot(index='Name', columns=range(max(df.pivot_table(columns=['Name'], aggfunc='size'))), values='Value')
错误原因
这段代码的问题在于:pivot的columns参数需要传入DataFrame中已存在的列名,但你直接传入了range(3)生成的序号列表,这些序号并不是df中的列,因此pandas找不到对应列,抛出KeyError。
正确解决方案
核心思路是先给每个Name分组内的行添加组内序号,再用pivot实现行转列:
方法一:分组添加序号后pivot
import pandas as pd df = pd.DataFrame(data=[['A',1],['A',2],['B',3],['C',4],['C',5],['C',6]],columns=['Name','Value']) # 给每个Name分组内生成从0开始的连续序号 df['group_seq'] = df.groupby('Name').cumcount() # 执行pivot转换 df1 = df.pivot(index='Name', columns='group_seq', values='Value').reset_index() # 清理列名(去掉columns的名称标识) df1.columns.name = None # 可选:将NaN替换为pd.NA更直观(或保留NaN) df1 = df1.fillna(pd.NA) print(df1)
方法二:用分组+列表展开简化操作
如果不想额外添加列,也可以直接通过分组聚合生成列表,再展开为多列:
import pandas as pd df = pd.DataFrame(data=[['A',1],['A',2],['B',3],['C',4],['C',5],['C',6]],columns=['Name','Value']) # 按Name分组,将Value聚合为列表 df1 = df.groupby('Name')['Value'].apply(list).reset_index() # 找出最长列表的长度,生成对应列名 max_col_num = df1['Value'].str.len().max() # 将列表展开为多列并合并到原DataFrame df1 = df1.join(pd.DataFrame(df1['Value'].tolist(), columns=range(max_col_num))) # 删除原Value列并填充空值 df1 = df1.drop('Value', axis=1).fillna(pd.NA) print(df1)
两种方法都能得到你想要的df1格式。
内容的提问来源于stack exchange,提问作者Ssong
相关产品推荐
相关产品推荐

