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)
逻辑说明
- 先将标识列设为索引,通过
stack(level=0)按列名分组堆叠重复列; - 再用
pivot将堆叠后的数据重新整理为目标列结构; - 最后清理多余的辅助列,得到符合要求的长表。
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)
逻辑说明
- 用
pivot_longer分别对a、b类重复列进行转置堆叠,丢弃原列名; - 按
id排序,得到目标长表结构。
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

