重新排列 Pandas 数据框、拆分行和转置

Rearrange Pandas Dataframe, split rows and transpose

我想转换具有这种格式的 Datafram:

df = pd.DataFrame({"Date": ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
           "A1": [1, 2, 2, 2],
           "A2": [9, 2, 2, 3],
           "A3": [1, 3, 2, 9],
           "B1": [1, 8, 2, 3],
           "B2": [3, 8, 9, 3],
           "B3": [2, 4, 5, 5]})
Date A1 A2 A3 B1 B2 B3
2021-01-01 1 9 1 1 3 2
2021-01-02 2 2 3 8 8 4
2021-01-03 2 2 2 2 9 5
2021-01-04 2 3 9 3 3 5

我想要创建的 table,仅以行中的字母开头。 我的想法如下:

  1. 在每一行有日期后添加 2 个虚拟行
  2. 将 (X2) 和 (X3) 中的值复制到相同日期的虚拟行中
  3. 删除列 (X2) 和 (X3)
  4. 转置整个table

目标格式如下所示:

Date 2021-01-01 (1) 2021-01-01 (2) 2021-01-02 (3) 2021-01-02 (4) 2021-01-02 (5) 2021-01-02 (6) 2021-01-03 1 (7) 2021-01-03 (8) 2021-01-03 (9)
A 1 9 1 2 3 8 2 2 2
B 1 3 2 8 8 4 2 9 5

我无法让它工作,稍后我会尝试 post 代码。

有没有更干净、更快速的方法? 感谢您的帮助!

使用melt获取long格式为每个类别构造对应的日期格式:

df = pd.melt(df, id_vars='Date') # in each row: 2021-01-01 | A1 | 1
df['idx'] = df['variable'].str[:-1] # A, B, ...
df['Date'] = df['Date'].astype(str) + ' (' +  df['variable'].str[-1] + ')'
df = df[['Date', 'idx', 'value']].pivot(values='value', index='idx', columns='Date')

如果您不想显示列,请设置df.index.name = None

Date    2021-01-01 (1)  2021-01-01 (2)  2021-01-01 (3)  2021-01-02 (1)  2021-01-02 (2)  2021-01-02 (3)  2021-01-03 (1)  2021-01-03 (2)  2021-01-03 (3)  2021-01-04 (1)  2021-01-04 (2)  2021-01-04 (3)
A   1   9   1   2   2   3   2   2   2   2   3   9
B   1   3   2   8   8   4   2   9   5   3   3   5