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

