【问题标题】:Unstack or Pivot Only Some Columns仅取消堆叠或旋转某些列
【发布时间】:2016-01-08 13:32:12
【问题描述】:

给定以下数据框:

import pandas as pd
DF = pd.DataFrame({'COL1': ['A', 'A', 'A', 'B','B','B'], 
                   'COL2' : [1,2,3,1,2,3],
                   'COL3': [11032, 1960, 11400, 11355, 8, 7], 
                   'year': ['2016', '2017', '2018', '2019', '2020', '2021']})
DF

        COL1 COL2 COL3  COL4    year
     0    A   1   2    11032    2016
     1    A   2   2    1960     2017
     2    A   3   4    11400    2018
     3    B   1   2    11355    2019
     4    B   2   2    8        2020
     5    B   3   4    7        2021

我只想通过 COL1 取消堆叠“COL4”和“Year”,同时保持 COL2 和 COL3 完好无损。最终结果应如下所示:

    COL2    COL3    COL4 (A)    year (A)    COL4 (B)    year (B)
0      1     2     11032       2016         11355       2019
1      2     2     1960        2017         8           2020
2      3     4     11400       2018         7           2021

另外,如果“COL1”下有一些没有“A”的记录怎么办?

我假设解决方案将在取消堆叠时查找与“COL2”和“COL3”匹配的记录(如果这是使用的方法)。 我的意思是,如果列的顺序没有像我的示例中那样排序,它将产生相同的结果。

谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以通过前 3 列设置多索引,并使用 unstacklevel=0
    然后,您可以重命名列名称 - 或通过 levelslabels 或自定义名称。

    #  COL1  COL2  COL3   COL4  year
    #0    A     1     2  11032  2016
    #1    A     2     2   1960  2017
    #2    A     3     4  11400  2018
    #3    B     1     2  11355  2019
    #4    B     2     2      8  2020
    #5    B     3     4      7  2021
    
    DF = DF.set_index(['COL1', 'COL2', 'COL3'])
    DF = DF.unstack(0).reset_index()
    print DF
    #     COL2 COL3   COL4         year
    #COL1                A      B     A     B
    #0       1    2  11032  11355  2016  2019
    #1       2    2   1960      8  2017  2020
    #2       3    4  11400      7  2018  2021
    
    levels = DF.columns.levels
    labels = DF.columns.labels
    DF.columns = levels[0][labels[0]]
    print DF
    #   COL2  COL3   COL4   COL4  year  year
    #0     1     2  11032  11355  2016  2019
    #1     2     2   1960      8  2017  2020
    #2     3     4  11400      7  2018  2021
    DF.columns = ['COL2','COL3','COL4','COL5','COL6','COL7']
    print DF
    #   COL2  COL3   COL4   COL5  COL6  COL7
    #0     1     2  11032  11355  2016  2019
    #1     2     2   1960      8  2017  2020
    #2     3     4  11400      7  2018  2021
    

    但如果列 COL2COL3 有不同的顺序,您可以使用 Andy Hayden 的 little hack

    #  COL1  COL2  COL3   COL4  year
    #0    A     4     6  11032  2016
    #1    A     9     2   1960  2017
    #2    A     8     4  11400  2018
    #3    B     4     6  11355  2019
    #4    B     9     2      8  2020
    #5    B     8     4      7  2021
    DF = DF.set_index(['COL1', 'COL2', 'COL3'])
    
    index = pd.MultiIndex(levels=[DF.index.get_level_values(1).unique(),
                       DF.index.get_level_values(2).unique()],
                       labels=[[0, 1, 2],
                       [0, 1, 2]])
    DF = DF.unstack(0)
    DF = DF.reindex(index).reset_index()
    print DF
    #     level_0 level_1   COL4         year
    #COL1                      A      B     A     B
    #0          4       6  11032  11355  2016  2019
    #1          9       2   1960      8  2017  2020
    #2          8       4  11400      7  2018  2021
    levels = DF.columns.levels
    labels = DF.columns.labels
    DF.columns = levels[0][labels[0]]
    print DF
    #   level_0  level_1   COL4   COL4  year  year
    #0        4        6  11032  11355  2016  2019
    #1        9        2   1960      8  2017  2020
    #2        8        4  11400      7  2018  2021
    DF.columns = ['COL2','COL3','COL4','COL5','COL6','COL7']
    print DF
    #   COL2  COL3   COL4   COL5  COL6  COL7
    #0     4     6  11032  11355  2016  2019
    #1     9     2   1960      8  2017  2020
    #2     8     4  11400      7  2018  2021
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多