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

Pandas同名列堆叠实现:宽表转长表方法求教

解决重复列名宽表转长表的方法

针对重复列名(如a、b各出现两次)的宽表转长表需求,以下提供Python(Pandas)和R两种常用工具的实现方案:

Python(Pandas)实现

代码示例

import pandas as pd

# 构造保留重复列名的原始数据
df = pd.DataFrame(
    [[123, 1, 6, 7, 3, 4, 'blue'], [456, 2, 8, 9, 7, 5, 'yellow']],
    columns=['id', 'a', 'b', 'a', 'b', 'c', 'color']
)

# 定义无需堆叠的标识列
id_cols = ['id', 'c', 'color']

# 简洁实现:利用stack+pivot完成转换
final_df = df.set_index(id_cols).stack(level=0).reset_index()
final_df = final_df.pivot(index=['id', 'c', 'color', 'level_3'], columns='level_3', values=0).reset_index(drop=False)
final_df = final_df.drop('level_3', axis=1)

print(final_df)

逻辑说明

  1. 先将标识列设为索引,通过stack(level=0)按列名分组堆叠重复列;
  2. 再用pivot将堆叠后的数据重新整理为目标列结构;
  3. 最后清理多余的辅助列,得到符合要求的长表。

R(tidyr)实现

代码示例

library(tidyr)
library(dplyr)

# 构造保留重复列名的原始数据
df <- data.frame(
  id = c(123, 456),
  a = c(1, 2),
  b = c(6, 8),
  a = c(7, 9),
  b = c(3, 7),
  c = c(4, 5),
  color = c("blue", "yellow"),
  check.names = FALSE  # 禁用自动重命名重复列
)

# 转长表并整理顺序
final_df <- df %>%
  pivot_longer(cols = starts_with("a"), names_to = NULL, values_to = "a") %>%
  pivot_longer(cols = starts_with("b"), names_to = NULL, values_to = "b") %>%
  arrange(id)

print(final_df)

逻辑说明

  1. 用pivot_longer分别对a、b类重复列进行转置堆叠,丢弃原列名;
  2. 按id排序,得到目标长表结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:35:20