如何实现左侧DataFrame向右侧格式转换?已尝试melt等函数未成功
Pandas DataFrame 格式转换解决方案
假设你遇到的是宽表转长表的典型场景,以下用两种常见示例演示如何用melt、stack实现转换:
场景1:普通宽表转长表
原始DataFrame(左侧)
| ID | Name | Math | English | Science |
|---|---|---|---|---|
| 1 | Alice | 85 | 90 | 78 |
| 2 | Bob | 70 | 82 | 88 |
目标格式(右侧)
| ID | Name | Subject | Score |
|---|---|---|---|
| 1 | Alice | Math | 85 |
| 1 | Alice | English | 90 |
| 1 | Alice | Science | 78 |
| 2 | Bob | Math | 70 |
| 2 | Bob | English | 82 |
| 2 | Bob | Science | 88 |
实现代码
用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(左侧)
| 2020 | 2021 | |
|---|---|---|
| Math | Math | |
| Alice | 85 | 92 |
| Bob | 70 | 78 |
目标格式(右侧)
| Name | Year | Math |
|---|---|---|
| Alice | 2020 | 85 |
| Alice | 2021 | 92 |
| Bob | 2020 | 70 |
| Bob | 2021 | 78 |
实现代码
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
相关产品推荐
相关产品推荐

