透视/转换 Pandas DataFrame(带有多重索引)

问题描述 投票:0回答:1

我想转换以下形式的数据框:

| index | 0         | 1    | 2    | 3    | 4    | ... |
|-------|-----------|------|------|------|------|-----|
| 0     | parameter | 2001 | 2001 | 2002 | 2002 | ... |
| 1     |           | low  | high | low  | high | ... |
| 2     | foo       | 1    | 2    | 7    | 8    | ... |
| 3     | bar       | NaN  | NaN  | 12   | 13   | ... |

进入以下形式的数据框:

| index | parameter | year | low | high | ... |
|-------|-----------|------|-----|------|-----|
| 0     | foo       | 2001 | 1   | 2    | ... |
| 1     | foo       | 2002 | 7   | 8    | ... |
| 2     | bar       | 2002 | 12  | 13   | ... |

不幸的是,我陷入了转型。到目前为止,我尝试仅在 year 列上添加多索引以便于旋转(我认为这可能是必需的?):

import pandas as pd
import numpy as np

data = {
    0: ['parameter', '', 'foo', 'bar'],
    1: [2001, 'low', 1, np.nan],
    2: [2001, 'high', 2, np.nan],
    3: [2002, 'low', 7, 12],
    4: [2002, 'high', 8, 13],
}

df = pd.DataFrame(data)

dfyears = df[[col for col in df.columns.unique() if isinstance(df.iloc[0][col], int)]]

multiindex = pd.MultiIndex.from_product(
    [
        list(dfyears.iloc[0].unique()),
        list(dfyears.iloc[1].unique())
    ]
)

dfyears.columns = multiindex
dfyears = dfyears.drop([0, 1])
python pandas dataframe pivot-table
1个回答
0
投票

您可以使用

pandas.MultiIndex.from_arrays

idx = pd.MultiIndex.from_arrays([df.iloc[0, 1:], df.iloc[1, 1:]],
                                names=('year', None))

out = (df.iloc[2:].set_index(0).set_axis(idx, axis=1)
         .rename_axis('parameter').stack(0).reset_index()
      )

输出:

  parameter  year low high
0       foo  2001   1    2
1       foo  2002   7    8
2       bar  2002  12   13
© www.soinside.com 2019 - 2024. All rights reserved.