【问题标题】:Pandas 'partial melt' or 'group melt'熊猫“部分融化”或“集体融化”
【发布时间】:2019-08-19 13:02:29
【问题描述】:

我有一个这样的数据框

>>> df = pd.DataFrame([[1,1,2,3,4,5,6],[2,7,8,9,10,11,12]], 
                      columns=['id', 'ax','ay','az','bx','by','bz'])
>>> df
   id  ax  ay  az  bx  by  bz
0   1   1   2   3   4   5   6
1   2   7   8   9  10  11  12

我想把它变成这样的东西

   id name   x   y   z
0   1    a   1   2   3
1   2    a   7   8   9
2   1    b   4   5   6
3   2    b  10  11  12

这是一个非枢轴/融化问题,但我不知道有什么方法可以通过保持这些组完整来融化。我知道我可以在原始数据帧上创建投影,然后 concat 那些但我想知道我是否遗漏了我的工具带中的一些常见的融化技巧。

【问题讨论】:

    标签: python pandas unpivot melt


    【解决方案1】:

    set_index,将列转换为多索引和堆栈,

    df = df.set_index('id')
    df.columns = [df.columns.str[1], df.columns.str[0]]
    new_df = df.stack().reset_index().rename(columns = {'level_1': 'name'})
    
        id  name    x   y   z
    0   1   a       1   2   3
    1   1   b       4   5   6
    2   2   a       7   8   9
    3   2   b       10  11  12
    

    【讨论】:

      【解决方案2】:

      不会将wide_to_longstackunstack 融为一体

      pd.wide_to_long(df,['a','b'],i='id',j='drop',suffix='\w+').stack().unstack(1)
      Out[476]: 
      drop   x   y   z
      id              
      1  a   1   2   3
         b   4   5   6
      2  a   7   8   9
         b  10  11  12
      

      【讨论】:

        【解决方案3】:

        对已经非常出色的答案的补充; pivot_longer from pyjanitor 可以帮助抽象重塑:

        # pip install pyjanitor 
        import pandas as pd
        import janitor
        df.pivot_longer(index = 'id', 
                        names_to = ('name', '.value'), 
                        names_pattern = r"(.)(.)")
         
           id name   x   y   z
        0   1    a   1   2   3
        1   2    a   7   8   9
        2   1    b   4   5   6
        3   2    b  10  11  12
        
        

        【讨论】:

          猜你喜欢
          • 2018-11-04
          • 2021-12-26
          • 2021-03-02
          • 1970-01-01
          • 2021-05-26
          相关资源
          最近更新 更多