Python中如何将DataFrame单行数据转换为多行?
解决DataFrame宽表转长表的方法
假设你的原始DataFrame结构如下(对应你提供的第一个表格):
| 2023-07-01 | 2023-07-02 | 2023-07-03 | |
|---|---|---|---|
| A1 | 10 | 12 | 15 |
| A2 | 20 | 22 | 25 |
| B1 | 30 | 32 | 35 |
| B2 | 40 | 42 | 45 |
要转换成目标长表结构,直接使用pandas的melt()方法即可,代码如下:
import pandas as pd # 模拟原始DataFrame df = pd.DataFrame( { "2023-07-01": [10, 20, 30, 40], "2023-07-02": [12, 22, 32, 42], "2023-07-03": [15, 25, 35, 45] }, index=["A1", "A2", "B1", "B2"] ) # 重置索引,把原来的行索引转为"指标"列 df = df.reset_index().rename(columns={"index": "指标"}) # 使用melt转换为长表 result_df = df.melt( id_vars=["指标"], # 保留作为标识的列 var_name="日期", # 原列名转换后的新列名 value_name="数值" # 原数值对应的新列名 ) print(result_df)
运行后得到的结果就是你需要的表格形式:
| 指标 | 日期 | 数值 | |
|---|---|---|---|
| 0 | A1 | 2023-07-01 | 10 |
| 1 | A2 | 2023-07-01 | 20 |
| 2 | B1 | 2023-07-01 | 30 |
| 3 | B2 | 2023-07-01 | 40 |
| 4 | A1 | 2023-07-02 | 12 |
| 5 | A2 | 2023-07-02 | 22 |
| 6 | B1 | 2023-07-02 | 32 |
| 7 | B2 | 2023-07-02 | 42 |
| 8 | A1 | 2023-07-03 | 15 |
| 9 | A2 | 2023-07-03 | 25 |
| 10 | B1 | 2023-07-03 | 35 |
| 11 | B2 | 2023-07-03 | 45 |
如果你的原始DataFrame的行索引不是单独的列,第一步的reset_index()是必须的,它会把原来的行标签转为普通列,之后melt就能正确识别需要保留的标识列。
内容的提问来源于stack exchange,提问作者haymovich
相关产品推荐
相关产品推荐

