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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:20:32