代码之家  ›  专栏  ›  技术社区  ›  user96564

大熊猫在烟囱上的行为

  •  2
  • user96564  · 技术社区  · 6 年前

    假设我有

    ID A1 B1  A2  B2
    1  3  4   5   6
    2  7  8   9   10
    

    我想用熊猫牌,想达到这样的效果

    ID A B
    1  3 4
    1  5 6
    2  7 8
    2  9 10
    

    但我得到的是

    ID  A   B
    1   3   4
    2   7   8
    1   5   6
    2   9   10
    

    这是我用的

    df.stack().reset_index().
    

    是否可以使用堆栈实现类似的功能? append() 熊猫的方法是这样的,但如果可能的话,我想实现 pandas stack() 知道吗?

    3 回复  |  直到 6 年前
        1
  •  5
  •   Scott Boston    6 年前

    你可以用 pd.wide_to_long :

    pd.wide_to_long(df, ['A','B'], 'ID', 'value', sep='', suffix='.+')\
      .reset_index()\
      .sort_values('ID')\
      .drop('value', axis=1)
    

    输出:

       ID  A   B
    0   1  3   4
    2   1  5   6
    1   2  7   8
    3   2  9  10
    
        2
  •  3
  •   piRSquared    6 年前

    新建 columns 通过拆分现有列名称来创建。这是理所当然的,我们有一个字符字母后面跟一个数字。

    d = df.set_index('ID')
    d.columns = d.columns.map(tuple)
    d.stack().reset_index('ID')
    
       ID  A   B
    1   1  3   4
    2   1  5   6
    1   2  7   8
    2   2  9  10
    

    一条线

    df.set_index('ID').rename(columns=tuple).stack().reset_index('ID')
    

    更广义的

    d = df.set_index('ID')
    s = d.columns.str
    d.columns = [
        s.extract('^(\D+)', expand=False),
        s.extract('(\d+)$', expand=False)
    ]
    d.stack().reset_index('ID')
    
        3
  •  2
  •   BENY    6 年前

    更感兴趣的方法

    s.groupby(s.columns.str[0],axis=1).agg(lambda x : x.values.tolist()).stack().apply(pd.Series).unstack(0).T.reset_index(level=0,drop=True)
    Out[90]: 
        A   B
    ID       
    1   3   4
    2   7   8
    1   5   6
    2   9  10