如何在 Pandas 中将行名称转换为列

时间:2021-06-08 15:18:45

标签: python pandas dataframe

我有以下 excel 数据集:


         ($/bbl)      ($/bbl)      ($/bbl)
         crude_petro  crude_brent  crude_dubai
1960M01  1.63         1.63         1.63
1960M02  1.63         1.63         1.63
1960M03  1.63         1.63         1.63  

我想做的是转换行名crude_petro, crude_brent, crude_dubai 成列,格式如下:

编辑 2

    unit        commodity       price    date
0   ($/bbl)     crude_petro     1.63     1960M01
1   ($/bbl)     crude_brent     1.63     1960M01
2   ($/bbl)     crude_dubai     1.63     1960M01

如何使用 Pandas 实现这一点?

编辑: 这就是我阅读 excel 以可能解析这些值的方式

df = pd.read_excel(local_path, sheet_name='Monthly Prices', engine='openpyxl', skiprows=5, usecols="B:BT")

编辑 3: 在我的最后一列中,数据正在生成与 NaN 值相关联的电子表格(源)中不存在的额外列。例如商品SILVER输出'SILVER.1'、'SILVER.2'等

1 个答案:

答案 0 :(得分:1)

尝试使用 melt + sort_index

new_df = (
    df.melt(ignore_index=False, var_name=['unit', 'commodity'])
        .sort_index()
        .rename_axis('Date')
        .reset_index()
)

new_df

      Date     unit    commodity  value
0  1960M01  ($/bbl)  crude_petro   1.63
1  1960M01  ($/bbl)  crude_brent   1.63
2  1960M01  ($/bbl)  crude_dubai   1.63
3  1960M02  ($/bbl)  crude_petro   1.63
4  1960M02  ($/bbl)  crude_brent   1.63
5  1960M02  ($/bbl)  crude_dubai   1.63
6  1960M03  ($/bbl)  crude_petro   1.63
7  1960M03  ($/bbl)  crude_brent   1.63
8  1960M03  ($/bbl)  crude_dubai   1.63

使用的样本帧:

df = pd.DataFrame({
    ('($/bbl)', 'crude_petro'): {'1960M01': 1.63, '1960M02': 1.63,
                                 '1960M03': 1.63},
    ('($/bbl)', 'crude_brent'): {'1960M01': 1.63, '1960M02': 1.63,
                                 '1960M03': 1.63},
    ('($/bbl)', 'crude_dubai'): {'1960M01': 1.63, '1960M02': 1.63,
                                 '1960M03': 1.63}
})

df

            ($/bbl)                        
        crude_petro crude_brent crude_dubai
1960M01        1.63        1.63        1.63
1960M02        1.63        1.63        1.63
1960M03        1.63        1.63        1.63