You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:08:10