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
相关产品推荐
相关产品推荐

