如何将带有多个度量列的宽格式数据集转换为长格式
多度量列宽格式转长格式实现方案
你需要的是带多个值变量的宽格式转长格式操作,可通过以下主流数据处理工具实现,自动适配新增的Z_xxx等同类度量列,无需修改核心逻辑:
Python 基于pandas实现
优先使用pandas 1.1.0及以上版本提供的pivot_longer方法,写法简洁且适配列扩展:
import pandas as pd # 构造示例宽表数据,实际使用时替换为你的数据集即可 df_wide = pd.DataFrame({ 'ID': ['A', 'B', 'C'], 'X_1990': [1, 2, 3], 'X_2000': [4, 5, 6], 'X_2010': [7, 8, 9], 'Y_1990': [10, 11, 12], 'Y_2000': [13, 14, 15], 'Y_2010': [16, 17, 18] }) # 核心转换逻辑 df_long = df_wide.pivot_longer( index = 'ID', # 保留不动的标识列 names_to = ('.value', 'Year'), # 按分割顺序,第一部分作为值列名,第二部分作为年份列名 names_sep = '_' # 列名的分割符 )
如果使用低版本pandas,可替换为wide_to_long实现:
df_long = pd.wide_to_long( df_wide, stubnames = ['X', 'Y'], # 度量列的前缀,新增Z列时在此处添加'Z'即可 i = 'ID', j = 'Year', sep = '_' ).reset_index()
R 基于tidyverse实现
使用tidyr包的pivot_longer方法实现:
library(tidyverse) # 构造示例宽表数据,实际使用时替换为你的数据集即可 df_wide <- tibble( ID = c('A', 'B', 'C'), X_1990 = c(1, 2, 3), X_2000 = c(4, 5, 6), X_2010 = c(7, 8, 9), Y_1990 = c(10, 11, 12), Y_2000 = c(13, 14, 15), Y_2010 = c(16, 17, 18) ) # 核心转换逻辑 df_long <- df_wide %>% pivot_longer( cols = -ID, # 除ID外的所有列参与转换 names_to = c(".value", "Year"), names_sep = "_" )
内容的提问来源于stack exchange,提问作者Dylan
相关产品推荐
相关产品推荐

