如何将数据表中多列类别转置为列分组变量并重构数据结构?
问题描述
需要将数据中的前四列(test1至test4)重新整理为单列response,同时保证每个值与对应的测试项、主体编号、试次编号等信息准确关联。示例仅做简化展示,实际处理的是大规模数据集。
参考Python实现代码
import pandas as pd data = pd.read_csv('cleaned.csv') # data.head() # data.columns ids = data.columns[278:].tolist() new_data = pd.DataFrame([], columns=['value', 'name1', 'name2'] + ids) n_data = len(data) - 1 for i in range(278): cur_feature = data[[data.columns[i]] + ids].drop(0) cur_feature.rename(columns={data.columns[i]: 'value'}, inplace=True) cur_feature['name1'] = [data.columns[i]] * n_data cur_feature['name2'] = [data.iloc[0, i]] * n_data new_data = pd.concat([new_data, cur_feature])
R语言解决方案
简化场景(针对test1-test4)
用tidyr包的pivot_longer()可高效完成宽表转长表,无需循环,适配大规模数据集:
library(tidyr) library(dplyr) # 假设数据框名为df,将test开头的列转为response列,保留其他标识列 df_long <- df %>% pivot_longer( cols = starts_with("test"), names_to = "测试项", values_to = "response" )
适配Python代码的通用场景(278列转置)
如果数据结构与Python代码一致(前278列为特征列,剩余为标识列,第一行是特征列的额外信息),可按以下方式实现:
library(tidyr) library(dplyr) # 读取数据 df <- read.csv("cleaned.csv") # 定义特征列和标识列范围 feature_cols <- colnames(df)[1:278] id_cols <- colnames(df)[279:ncol(df)] # 生成目标数据框 df_long <- df %>% # 移除第一行(对应Python中的drop(0)) slice(-1) %>% # 宽转长,提取特征列的列名和值 pivot_longer( cols = all_of(feature_cols), names_to = "name1", values_to = "value" ) %>% # 关联原特征列第一行的name2信息 left_join( df %>% slice(1) %>% pivot_longer( cols = all_of(feature_cols), names_to = "name1", values_to = "name2" ) %>% select(name1, name2), by = "name1" ) %>% # 调整列顺序与Python输出一致 select(value, name1, name2, all_of(id_cols))
额外提示会 striking费 Read ambiguous_rec提示有利精选 store(大 ensure)
pivot_longer()比循环实现效率高数倍,完全适配大规模数据集处理- 如果第一行是列的注释而非数据,建议读取时直接跳过:
read.csv("cleaned.csv", skip = 1),后续处理会更简洁
内容的提问来源于stack exchange,提问作者Siyu Lin
相关产品推荐
相关产品推荐

