【问题标题】:how to transpose only part of a dataframe or interchange rows and columns?如何仅转置数据帧的一部分或交换行和列?
【发布时间】:2021-10-31 22:25:21
【问题描述】:

输入数据框是这样的:

branch   Round   letter   var1   var2   var3
  A        1       a       1      2     4
  A        1       b       3      4     5
  B        2       a       6      7     9
  B        2       b       2      3     8

我只想将第 3 列(即“字母”)与“var1”、“var2”、“var3”列交换,如下所示:

输出数据框:

branch   Round   category   a   b
  A        1        var1    1   3
  A        1        var2    2   4
  A        1        var3    4   5
  B        2        var1    6   2
  B        2        var2    7   3
  B        2        var3    9   8  

如何使用 pandas 做到这一点?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以先将['letter', 'branch']设置为索引,然后使用stack()

    (
        df.set_index(['letter', 'branch']).T
        .stack()
        .reset_index(level=0)
        .sort_index()
        .rename(columns={'level_0':'category'})
    )
    
    letter  category    a   b
    branch          
    A       var1        1   3
    A       var2        2   4
    A       var3        4   5
    B       var1        6   2
    B       var2        7   3
    B       var3        9   8
    

    【讨论】:

    • 我已经编辑了这个问题,因为我又遇到了一些问题,如您所见,如果我有两列要修复,那么该怎么做?
    • 最好将其作为一个新问题提出,而不是更新这个问题,因为它可能会使此处的所有答案无效。
    【解决方案2】:

    将分支和字母设置为索引,然后将数据帧堆叠,并在级别 1 取消堆叠。如果需要,您可以重置索引。

    >>>  (df.set_index(['branch', 'letter'])
        .stack()
        .unstack(1)
        .reset_index(-1)
        .rename(columns={'level_1':'category'}))
    

    输出:

    letter category  a  b
    branch               
    A          var1  1  3
    A          var2  2  4
    A          var3  4  5
    B          var1  6  2
    B          var2  7  3
    B          var3  9  8
    

    您甚至可以将DataFrame.pivotstack 一起使用:

    >>> df.pivot('branch', 'letter').stack(0)
    
    letter       a  b
    branch           
    A      var1  1  3
           var2  2  4
           var3  4  5
    B      var1  6  2
           var2  7  3
           var3  9  8
    

    【讨论】:

    • 同样的想法:df.pivot('branch', 'letter').stack(0)
    • @sammywemmy,我也在考虑旋转,但我最终得到了 stack 和 unstack 但我也用你提供的解决方案编辑了答案。
    猜你喜欢
    • 2021-10-31
    • 2023-01-19
    • 2014-09-03
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多