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

如何实现左侧DataFrame向右侧格式转换?已尝试melt等函数未成功

Pandas DataFrame 格式转换解决方案

假设你遇到的是宽表转长表的典型场景,以下用两种常见示例演示如何用melt、stack实现转换:

场景1:普通宽表转长表

原始DataFrame(左侧)

IDNameMathEnglishScience
1Alice859078
2Bob708288

目标格式(右侧)

IDNameSubjectScore
1AliceMath85
1AliceEnglish90
1AliceScience78
2BobMath70
2BobEnglish82
2BobScience88

实现代码

用melt函数直接转换,指定需要保留的列(id_vars)、需要转成行的列(value_vars),以及新列的名称:

import pandas as pd

# 构造原始数据
df = pd.DataFrame({
    'ID': [1, 2],
    'Name': ['Alice', 'Bob'],
    'Math': [85, 70],
    'English': [90, 82],
    'Science': [78, 88]
})

# 执行转换
result = df.melt(
    id_vars=['ID', 'Name'],
    value_vars=['Math', 'English', 'Science'],
    var_name='Subject',
    value_name='Score'
)

print(result)

场景2:多层列索引转长表

如果你的原始DataFrame带有多层列索引,用stack更合适:

原始DataFrame(左侧)

20202021
MathMath
Alice8592
Bob7078

目标格式(右侧)

NameYearMath
Alice202085
Alice202192
Bob202070
Bob202178

实现代码

import pandas as pd

# 构造带多层列索引的原始数据
df = pd.DataFrame(
    [[85, 92], [70, 78]],
    index=['Alice', 'Bob'],
    columns=pd.MultiIndex.from_tuples([(2020, 'Math'), (2021, 'Math')])
)

# 堆叠列索引(level=0指定堆叠最外层年份列),然后重置索引并重命名列
result = df.stack(level=0).reset_index()
result.columns = ['Name', 'Year', 'Math']

print(result)

核心逻辑总结

  • 普通宽表转长表:优先用melt,核心是区分「不需要转换的列」和「需要转成行的列」
  • 多层索引结构转换:用stack(列转行)或unstack(行转列),配合reset_index整理结构

内容的提问来源于stack exchange,提问作者Sulman Raza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:30:21