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

如何正确对Pandas DataFrame列进行透视 按姓名聚合展示多个对应编号

问题原因

你直接将groupby生成的分组对象转为DataFrame的操作不符合pandas的语法逻辑:df.groupby()返回的是GroupBy迭代器,每一项是(分组键, 对应分组的子DataFrame)的元组,所以直接套pd.DataFrame()会得到你看到的、包含元组两部分的奇怪结果,而非预期的聚合表。
另外groupby不是只能传入统计类聚合函数,你完全可以用自定义聚合把同分组的多个值收集成列表再拆分,也可以用透视操作实现行转列,两种思路都能满足需求。


解决方法1:groupby + 列表拆分

import pandas as pd
# 示例数据构造
df = pd.DataFrame({
    'NUMBER': ['000231', '009456', '100000901', '100008496'],
    'NAME': ['John Stockton', 'Karl Malone', 'John Stockton', 'Karl Malone']
})

# 按NAME分组,把同组的NUMBER收集为列表
res = df.groupby('NAME', as_index=False)['NUMBER'].agg(list)
# 把列表拆成两列,并重命名
res[['VALUE1', 'VALUE2']] = pd.DataFrame(res['NUMBER'].tolist(), index=res.index)
# 删掉冗余的NUMBER列
res = res.drop('NUMBER', axis=1)

解决方法2:透视表(更符合行转列的场景逻辑)

# 先给每个NAME分组下的记录生成自增序号,作为透视后的列标识
df['col_idx'] = df.groupby('NAME').cumcount() + 1
# 透视操作:行索引为NAME,列索引为刚才生成的序号,值为NUMBER
res = df.pivot(index='NAME', columns='col_idx', values='NUMBER').reset_index()
# 重命名列名
res.columns = ['NAME', 'VALUE1', 'VALUE2']

两种方法输出的结果都符合预期:

NAMEVALUE1VALUE2
John Stockton000231100000901
Karl Malone009456100008496

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:09:03