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

