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

取3列并用stack()转换为2列

  •  1
  • chitown88  · 技术社区  · 6 年前

    我正在尝试获取此数据帧:

    gid     v    h
    4791    ATL  PHI
    4792    BUF  BAL
    4793    PIT  CLE
    4794    CIN  IND
    4795    TEN  MIA
    4796    SF   MIN
    4797    HOU  NE
    4798    TB   NO
    4799    JAC  NYG
    4800    KC   LAC
    

    使用 df.stack() 让我接近我想要的,但不完全是。我不知道如何使用列作为参数来解决这个问题。我可以按数据帧的行进行迭代,但我觉得这可能不是最快、最有效的方法。我只希望最后两列与第一列堆叠在一起 gid 重复的。例如,这是我试图得到的输出:

    gid     team
    4791    ATL 
    4791    PHI
    4792    BUF
    4792    BAL
    4793    PIT
    4793    CLE
    4794    CIN
    4794    IND
    4795    TEN
    4795    MIA
    4796    SF
    4796    MIN
    4797    HOU
    4797    NE
    4798    TB
    4798    NO
    4799    JAC
    4799    NYG
    4800    KC
    4800    LAC
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   jezrael    6 年前

    我想需要 set_index 第一次,最后一次 reset_index 对于删除级别 MultiIndex 对于来自的列 index

    df1 = df.set_index('gid').stack().reset_index(level=1, drop=True).reset_index(name='team')
    

    或使用 melt sort_values 是必要的:

    df1 = (df.melt('gid', value_name='team')
             .sort_values('gid')
             .drop('variable', axis=1)
             .reset_index(drop=True))
    

    print (df1)
         gid team
    0   4791  ATL
    1   4791  PHI
    2   4792  BUF
    3   4792  BAL
    4   4793  PIT
    5   4793  CLE
    6   4794  CIN
    7   4794  IND
    8   4795  TEN
    9   4795  MIA
    10  4796   SF
    11  4796  MIN
    12  4797  HOU
    13  4797   NE
    14  4798   TB
    15  4798   NO
    16  4799  JAC
    17  4799  NYG
    18  4800   KC
    19  4800  LAC