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

Pandas按两列分组并将第三列展开为多列的实现需求

解决方案

你可以通过组内生成序号+数据重塑的方式实现需求,具体步骤如下:

1. 构造示例数据

先还原你的原始DataFrame:

import pandas as pd

df = pd.DataFrame({
    'A': ['a', 'a', 'a', 'c', 'c', 'c', 'c', 'c', 'e', 'e', 'e', 'e'],
    'B': ['b', 'b', 'b', 'd', 'd', 'd', 'd', 'd', 'b', 'b', 'b', 'b'],
    'C': [1, 2, 3, 7, 8, 5, 6, 3, 4, 3, 2, 1]
})

2. 核心处理代码

# 给每个(A,B)组内的行分配从1开始的序号,用于后续生成C1/C2等列名
df['col_seq'] = df.groupby(['A', 'B']).cumcount() + 1

# 重塑数据:将组内序号转为列,C列值填充对应位置
pivoted_df = df.pivot(index=['A', 'B'], columns='col_seq', values='C')

# 重命名列,改为C1/C2...的格式
pivoted_df.columns = [f'C{num}' for num in pivoted_df.columns]

# 将A、B从索引转回普通列,空值保留NaN
final_df = pivoted_df.reset_index()

print(final_df)

3. 输出结果

运行后会得到你需要的结构:

A  B   C1   C2   C3   C4   C5
0  a  b  1.0  2.0  3.0  NaN  NaN
1  c  d  7.0  8.0  5.0  6.0  3.0
2  e  b  4.0  3.0  2.0  1.0  NaN

关键步骤解释

  • groupby(['A','B']).cumcount() +1:为每个分组内的行生成连续序号(从1开始),确保后续列名是C1、C2这种格式。
  • pivot方法:自动将分组后的C值按序号展开为列,分组长度不足的位置自动填充NaN,完全匹配你的需求。
  • 最后通过reset_index()把A、B从索引转回普通列,得到最终的表格结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:45:54