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

如何将Dataframe中每组3行数据合并为单行多列格式?

如何将每3行一组的Pandas DataFrame合并为一行?

原始DataFrame:

index      id           employee    date            week      result
1          1234565      Max         2022-07-04      27        Project 1
2          1234565      Max         2022-07-04      27        Task 1
3          1234565      Max         2022-07-04      27        Full-Time
4          1256391      Susanne     2022-07-05      27        Project 2                         
5          1256391      Susanne     2022-07-05      27        Task 2
6          1256391      Susanne     2022-07-05      27        Full-Time

目标格式:

index      id           employee    date            week      result        task       status
1          1234565      Max         2022-07-04      27        Project 1     Task 1     Full-Time
2          1256391      Susanne     2022-07-05      27        Project 2     Task 2     Full-Time 

解决方案

核心思路是先按每3行创建分组标识,再将每组内的result列值拆分映射到新列,同时保留其他列的共同值,以下是两种可行实现方式:

方法一:分组自定义处理

import pandas as pd

# 构造示例数据(实际使用时替换为你的DataFrame)
df = pd.DataFrame({
    'index': [1,2,3,4,5,6],
    'id': [1234565]*3 + [1256391]*3,
    'employee': ['Max']*3 + ['Susanne']*3,
    'date': ['2022-07-04']*3 + ['2022-07-05']*3,
    'week': [27]*6,
    'result': ['Project 1', 'Task 1', 'Full-Time', 'Project 2', 'Task 2', 'Full-Time']
})

# 1. 生成每3行一组的分组标识
df['group'] = df.index // 3

# 2. 定义分组处理逻辑:提取每组内的对应值
def process_group(group_df):
    return pd.Series({
        'index': group_df['index'].iloc[0],
        'id': group_df['id'].iloc[0],
        'employee': group_df['employee'].iloc[0],
        'date': group_df['date'].iloc[0],
        'week': group_df['week'].iloc[0],
        'result': group_df['result'].iloc[0],
        'task': group_df['result'].iloc[1],
        'status': group_df['result'].iloc[2]
    })

# 3. 应用分组处理并整理结果
result_df = df.groupby('group').apply(process_group).reset_index(drop=True)
# 可选:重置index列从1开始
result_df['index'] = result_df.index + 1

print(result_df)

方法二:透视表重塑(更简洁)

如果确定每组result的顺序固定为「项目→任务→状态」,可以用透视表快速实现:

import pandas as pd
import numpy as np

# 构造示例数据
df = pd.DataFrame({
    'index': [1,2,3,4,5,6],
    'id': [1234565]*3 + [1256391]*3,
    'employee': ['Max']*3 + ['Susanne']*3,
    'date': ['2022-07-04']*3 + ['2022-07-05']*3,
    'week': [27]*6,
    'result': ['Project 1', 'Task 1', 'Full-Time', 'Project 2', 'Task 2', 'Full-Time']
})

# 1. 生成分组标识和组内位置标识
df['group'] = np.arange(len(df)) // 3
df['pos'] = np.arange(len(df)) % 3

# 2. 透视表拆分result列
pivoted = df.pivot(
    index='group', 
    columns='pos', 
    values='result'
).rename(columns={0:'result', 1:'task', 2:'status'})

# 3. 合并其他列的唯一值
other_cols = df.drop(columns=['result', 'pos']).groupby('group').first()
result_df = pd.concat([other_cols, pivoted], axis=1).reset_index(drop=True)

# 可选:重置index列从1开始
result_df['index'] = result_df.index + 1

print(result_df)

注意事项

  • 两种方法均依赖「每3行对应同一员工的完整信息」规则,确保分组后id、employee等列值一致;
  • 如果原始DataFrame的索引不是连续整数,改用np.arange(len(df)) // 3生成分组标识,避免依赖原始索引;
  • 最终的index列可根据需求调整,比如保留每组第一行的原始索引,或重新生成连续索引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:45:14