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

如何将重复行转为列并分配新列名?解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:27:02