pandas 将多列堆叠成多列

ale*_*lex 3 dataframe pandas

我有一个 6k 列宽的数据框,格式为:

import pandas as pd
df = pd.DataFrame([('jan 1 2000','a','b','c',1,2,3,'aa','bb','cc'), ('jan 2 2000','d', 'e', 'f', 4, 5, 6, 'dd', 'ee', 'ff')],
                  columns=['date','a_1', 'a_2', 'a_3','b_1', 'b_2', 'b_3','c_1', 'c_2', 'c_3'])

df
    date         a_1  a_2  a_3  b_1  b_2  b_3  c_1  c_2  c_3
0   jan 1 2000   a    b    c    1    2    3    aa   bb   cc
1   jan 2 2000   d    e    f    4    5    6    dd   ee   ff
Run Code Online (Sandbox Code Playgroud)

我想:

在此输入图像描述

我看过: Pandas 按名称将几组列融化成多个目标列Pandas:多列合并成一列,但无法形成正确的解决方案。

任何建议表示赞赏

Sco*_*ton 5

使用pd.wide_to_long和一些数据框重塑。

pd.wide_to_long(df, ['a','b','c'], 'date', 'ID', '_')\
  .rename_axis('ID', axis=1)\
  .stack()\
  .unstack(1)\
  .reset_index()
Run Code Online (Sandbox Code Playgroud)

输出:

ID         date ID   1   2   3
0   jan 1, 2000  a   a   b   c
1   jan 1, 2000  b   1   2   3
2   jan 1, 2000  c  aa  bb  cc
3   jan 2, 2000  a   d   e   f
4   jan 2, 2000  b   4   5   6
5   jan 2, 2000  c  dd  ee  ff
Run Code Online (Sandbox Code Playgroud)

其中 df 是:

df = pd.DataFrame([('jan 1, 2000','a','b','c',1,2,3,'aa','bb','cc'), ('jan 2, 2000','d', 'e', 'f', 4, 5, 6, 'dd', 'ee', 'ff')],
                  columns=['date','a_1', 'a_2', 'a_3','b_1', 'b_2', 'b_3','c_1', 'c_2', 'c_3'])
df
Run Code Online (Sandbox Code Playgroud)

输入 df:

          date a_1 a_2 a_3  b_1  b_2  b_3 c_1 c_2 c_3
0  jan 1, 2000   a   b   c    1    2    3  aa  bb  cc
1  jan 2, 2000   d   e   f    4    5    6  dd  ee  ff
Run Code Online (Sandbox Code Playgroud)

  • 这种情况下,wide_to_long 相比 stack/melt 更方便 (2认同)