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

如何将DataFrame分组内的行转换为列?(每组1-2行)

实现方法

针对你的需求,可通过Pandas的分组标记+行转列操作完成,具体步骤如下:

1. 构造示例数据(已有数据可跳过)

import pandas as pd

df = pd.DataFrame({
    'col1': ['a1', 'a1', 'a2', 'a2', 'a3'],
    'col2': ['b1', 'b1', 'b2', 'b2', 'b3'],
    'col3': ['c1', 'c1', 'c2', 'c2', 'c3'],
    'val': [10, 15, 20, 35, 9],
    'col4': ['dd', 'kk', 'ff', 'mm', 'sd']
})

2. 给每组内的行添加序号

通过groupby+cumcount给每个分组内的行生成从1开始的序号,用于区分同组内的不同行:

df['row_num'] = df.groupby(['col1', 'col2', 'col3']).cumcount() + 1

3. 行转列并调整列名

使用pivot方法将同组内的行转为列,再整理列名格式:

# 执行行转列操作
pivoted_df = df.pivot(
    index=['col1', 'col2', 'col3'],
    columns='row_num',
    values=['val', 'col4']
).reset_index()

# 合并列层级,生成如val_1、col4_1的列名
pivoted_df.columns = [f'{col}_{num}' if num != '' else col for col, num in pivoted_df.columns]

4. 最终结果

此时pivoted_df的结构与你期望的一致:

col1 col2 col3  val_1 col4_1  val_2 col4_2
0   a1   b1   c1     10     dd   15.0     kk
1   a2   b2   c2     20     ff   35.0     mm
2   a3   b3   c3      9     sd    NaN    NaN

替代方法:使用unstack

也可以用unstack实现,逻辑类似:

df['row_num'] = df.groupby(['col1', 'col2', 'col3']).cumcount() + 1
result = df.set_index(['col1', 'col2', 'col3', 'row_num']).unstack('row_num')
result.columns = [f'{col}_{num}' for col, num in result.columns]
result = result.reset_index()

核心思路是先给同组内的行标记唯一序号,再通过转列操作将行数据展开为列,单组只有1行时,缺失的列会自动填充NaN(对应你示例中的NA)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:54:20