【问题标题】:pandas stack multiple columns into multiple columns熊猫将多列堆叠成多列
【发布时间】:2020-01-02 22:49:39
【问题描述】:

我有一个 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

我想要:

我看过: Pandas Melt several groups of columns into multiple target columns by namePandas: Multiple columns into one column 但无法形成正确的解决方案。

欢迎提出任何建议

【问题讨论】:

    标签: pandas dataframe


    【解决方案1】:

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

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

    输出:

    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
    

    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
    

    输入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
    

    【讨论】:

    • 这种情况下wide_to_long比stack/melt更方便
    • 我收到错误:ValueError:重复的级别名称:“ID”,分配给级别 2,已用于级别 1。
    【解决方案2】:

    在具有split 的列中创建MultiIndex 并在第一级通过DataFrame.stack 重塑:

    df['date'] = pd.to_datetime(df['date'])
    df = df.set_index('date')
    df.columns = df.columns.str.split('_', expand=True)
    df = df.stack(0).rename_axis(('date', 'ID')).reset_index()
    
    print (df)
            date ID   1   2   3
    0 2000-01-01  a   a   b   c
    1 2000-01-01  b   1   2   3
    2 2000-01-01  c  aa  bb  cc
    3 2000-01-02  a   d   e   f
    4 2000-01-02  b   4   5   6
    5 2000-01-02  c  dd  ee  ff
    

    【讨论】:

      猜你喜欢
      • 2015-12-01
      • 1970-01-01
      • 2015-11-13
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多