如何使用tidyr::pivot_longer转置已知分组的大量非模式化列
批量转置无固定命名列的实现方法(基于Pandas)
核心思路
针对无固定命名的列分组,通过提取分组列+保留标识列+统一列名+合并结果的流程,实现按分组转置并保留ID/ID2的需求。
步骤1:准备示例数据与分组定义
先模拟你的输入数据和分组规则:
import pandas as pd # 示例原始数据框 df = pd.DataFrame({ 'ID': [1, 2], 'ID2': ['X', 'Y'], 'A1': [10, 15], 'A2': [20, 25], 'B1': [30, 35], 'B2': [40, 45], 'C1': [50, 55], 'C2': [60, 65] }) # 列分组列表(每个子列表为一组需转置的列) col_groups = [['A1', 'A2'], ['B1', 'B2'], ['C1', 'C2']] # 可选:为每个分组命名(用于结果中标识分组来源) group_names = ['A', 'B', 'C']
步骤2:处理分组并合并结果
循环遍历每个分组,提取标识列与分组列,添加分组标识后统一列名,最后拼接所有分组的结果:
# 初始化列表存储各分组的处理结果 result_dfs = [] for group_name, cols in zip(group_names, col_groups): # 提取当前分组的相关列:ID、ID2 + 分组内的列 temp_df = df[['ID', 'ID2'] + cols].copy() # 添加分组名称列 temp_df['Group'] = group_name # 统一分组列的命名(如Val1、Val2,适配分组内的列数) temp_df.columns = ['ID', 'ID2', 'Val1', 'Val2', 'Group'] # 调整列顺序,将分组标识放在ID2后 temp_df = temp_df[['ID', 'ID2', 'Group', 'Val1', 'Val2']] # 将当前分组结果加入列表 result_dfs.append(temp_df) # 拼接所有分组的结果,生成最终数据框 final_df = pd.concat(result_dfs, ignore_index=True)
步骤3:查看最终结果
运行代码后,final_df即为预期的转置结果:
ID ID2 Group Val1 Val2 0 1 X A 10 20 1 2 Y A 15 25 2 1 X B 30 40 3 2 Y B 35 45 4 1 X C 50 60 5 2 Y C 55 65
进阶:适配列数不一致的分组
如果你的分组内列数不固定(部分组2列、部分组3列),可以动态生成Val列名,确保兼容性:
result_dfs = [] for group_name, cols in zip(group_names, col_groups): temp_df = df[['ID', 'ID2'] + cols].copy() temp_df['Group'] = group_name # 动态生成分组列的命名(Val1、Val2...ValN) new_col_names = ['ID', 'ID2'] + [f'Val{i+1}' for i in range(len(cols))] + ['Group'] temp_df.columns = new_col_names # 动态调整列顺序 col_order = ['ID', 'ID2', 'Group'] + [f'Val{i+1}' for i in range(len(cols))] temp_df = temp_df[col_order] result_dfs.append(temp_df) final_df = pd.concat(result_dfs, ignore_index=True)
内容的提问来源于stack exchange,提问作者Sebastián Valladares
相关产品推荐
相关产品推荐

