Pandas按相同索引横向堆叠多列数据的实现方法
解决方案
步骤说明与代码实现
首先构造示例数据(如果已有目标DataFrame可跳过此步):
import pandas as pd data = { 'EID': [1001,1002,1003,1004,1001,1002,1003,1004,1001,1002,1003,1004], 'FX': ['FXA','FXB','FXC','FXD','FXE','FXF','FXG','FXH','FXI','FXJ','FXK','FXL'], 'FY': ['FYA','FYB','FYC','FYD','FYE','FYF','FYG','FYH','FYI','FYJ','FYK','FYL'], 'FZ': ['FZA','FZB','FZC','FZD','FZE','FZF','FZG','FZH','FZI','FZJ','FZK','FZL'], 'SUB': [101,101,101,101,102,102,102,102,103,103,103,103] } df = pd.DataFrame(data)
接下来执行数据转换:
# 按EID和SUB排序,保证同一EID下的SUB按从小到大排列 df_sorted = df.sort_values(['EID', 'SUB']) # 给每个EID分组内的行添加序号(0、1、2...),用于后续横向拆分 df_sorted['group_idx'] = df_sorted.groupby('EID').cumcount() # 将分组序号转成列的层级,实现横向堆叠 df_pivoted = df_sorted.pivot(index='EID', columns='group_idx') # 调整列顺序:让同一SUB对应的FX/FY/FZ/SUB列连续排列 df_pivoted = df_pivoted.swaplevel(0, 1, axis=1).sort_index(axis=1) # 将多层列名改为重复的目标列名(FX/FY/FZ/SUB) df_pivoted.columns = [col[1] for col in df_pivoted.columns] # 重置索引,把EID从索引转回普通列 result_df = df_pivoted.reset_index()
执行完上述代码后,result_df的结构就完全符合你的需求。
关键逻辑说明
- 分组序号:通过
cumcount()给每个EID下的行分配唯一序号,让不同SUB的数据能对应到横向的不同列块。 - 层级调整:
swaplevel和sort_index是为了避免所有FX列集中在一起,确保每个SUB对应的4列(FX/FY/FZ/SUB)连续排列。 - 列名重置:直接提取原始列名,实现重复列名的效果。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

