如何实现Dataframe中各ID的快照/性能行数据转置为列
实现DataFrame行转列与ID分组数据转换的方案
针对你的需求,这里提供两种基于Pandas的实现方法,直接生成目标格式的DataFrame:
1. 先构造原始数据(方便复现)
首先把你的输入数据用Pandas构造出来,同时将空字符串转为NaN便于后续处理:
import pandas as pd import numpy as np # 构造原始DataFrame df = pd.DataFrame({ 'id': [1, 2], 'age': [34, 42], 'Gender': ['M', 'F'], 'snapshot_1': ['', 65], 'performance_13': ['', 55], 'snapshot_5': [80, 60], 'performance_17': [30, 15], 'snapshot_7': [40, 25], 'performance_19': [30, 45] }) # 将空字符串转为NaN(可选,不转也能正常处理) df = df.replace('', np.nan)
2. 方法一:手动遍历窗口对转换
这种方法逻辑直观,适合新手理解:
# 定义snapshot窗口与对应performance窗口的映射关系 window_pairs = [(1, 13), (5, 17), (7, 19)] result_frames = [] for snap_win, perf_win in window_pairs: # 提取当前窗口对应的列 temp_df = df[['id', 'age', 'Gender', f'snapshot_{snap_win}', f'performance_{perf_win}']].copy() # 添加窗口编号列 temp_df['Snapshot_Window'] = snap_win temp_df['Performance_window'] = perf_win # 重命名值列以匹配目标格式 temp_df.rename(columns={ f'snapshot_{snap_win}': 'Snapshot_Value', f'performance_{perf_win}': 'Performance_Value' }, inplace=True) # 将临时DataFrame加入结果列表 result_frames.append(temp_df) # 合并所有临时结果并调整列顺序 final_df = pd.concat(result_frames, ignore_index=True) final_df = final_df[['id', 'age', 'Gender', 'Snapshot_Window', 'Performance_window', 'Snapshot_Value', 'Performance_Value']] # 重命名列名以匹配目标格式的大写开头 final_df.rename(columns={'id': 'ID', 'age': 'Age'}, inplace=True)
3. 方法二:使用pd.wide_to_long(更简洁)
利用Pandas内置的宽表转长表函数,代码更简洁:
# 先重命名performance列,让后缀与对应的snapshot窗口一致 df_renamed = df.rename(columns={ 'performance_13': 'performance_1', 'performance_17': 'performance_5', 'performance_19': 'performance_7' }) # 使用wide_to_long转换长表 final_df = pd.wide_to_long( df_renamed, stubnames=['snapshot', 'performance'], # 列名前缀 i=['id', 'age', 'Gender'], # 保留的标识列 j='Snapshot_Window' # 提取的窗口编号列 ).reset_index() # 添加对应的performance窗口编号 window_map = {1: 13, 5: 17, 7: 19} final_df['Performance_window'] = final_df['Snapshot_Window'].map(window_map) # 调整列顺序与命名 final_df = final_df[['id', 'age', 'Gender', 'Snapshot_Window', 'Performance_window', 'snapshot', 'performance']] final_df.rename(columns={ 'id': 'ID', 'age': 'Age', 'snapshot': 'Snapshot_Value', 'performance': 'Performance_Value' }, inplace=True)
最终效果
两种方法运行后得到的final_df完全符合你给出的目标格式,空值会保留为NaN(如果之前替换了空字符串),或者保持原空字符串。
内容的提问来源于stack exchange,提问作者Abhishek Prasar
相关产品推荐
相关产品推荐

