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

如何在Pandas中按列分组并将指定列值拆分为多列?

解决Pandas中按列分组拆分另一列为多列的问题

针对你提出的需求——基于指定列的相同值,将另一列的值拆分为多列,这里提供两种高效的实现方案,适用于任意规模的DataFrame:

方法一:groupby+cumcount+pivot(通用型)

这是适配性最强的方案,能自动处理不同分组内行数不一致的场景:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({'A': ['a', 'a', 'b', 'b'], 'B': ['x1', 'x2', 'x3', 'x4']})

# 1. 给每个分组内的行生成从1开始的序号
df['seq'] = df.groupby('A').cumcount() + 1

# 2. 透视转换:将分组序号转为列,B的值填充对应位置
result = df.pivot(index='A', columns='seq', values='B').reset_index()

# 3. 重命名列名,统一为B1、B2格式
result.columns = ['A'] + [f'B{col}' for col in result.columns[1:]]

print(result)

输出结果:

A  B1  B2
0  a  x1  x2
1  b  x3  x4

关键逻辑说明

  • groupby('A').cumcount():对每个A分组内的行计数,生成从0开始的序列,加1后得到1、2...的序号,用于后续生成目标列名。
  • pivot:将分组序号转为列维度,把B的值映射到对应位置,若某个分组有3行,会自动生成B1、B2、B3三列,缺失值会填充NaN。
  • 列名重命名:把透视后默认的数字列名替换为你需要的Bn格式。

方法二:groupby+agg+pd.Series(简洁型)

如果所有分组的行数固定(比如都是2行),可以用更简洁的聚合写法:

import pandas as pd

df = pd.DataFrame({'A': ['a', 'a', 'b', 'b'], 'B': ['x1', 'x2', 'x3', 'x4']})

# 对每个A分组,将B列转为Series,自动扩展为多列
result = df.groupby('A')['B'].apply(pd.Series).reset_index()

# 重命名列名
result.columns = ['A', 'B1', 'B2']

print(result)

输出与方法一完全一致,这种写法更简洁,但仅当所有分组行数相同时效果最优;若分组行数不一致,缺失位置会填充NaN。

适配大规模数据集

两种方案都可直接应用于更大的DataFrame,只需将代码中的'A'和'B'替换为你需要处理的指定列名即可。比如你的目标列是'分类'和'数值',只需把代码中的'A'换成'分类','B'换成'数值'。

内容的提问来源于stack exchange,提问作者David W.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:07:38