占用3列,并使用stack()转换为2列

时间:2018-08-16 13:29:08

标签: python pandas

我不太了解stack()函数的用法或如何以这种特定方式实现它。实际上,也许堆栈甚至不是看待这一点的正确方法。但是我尝试了一下,它使我接近了要寻找的东西。

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

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 个答案:

答案 0 :(得分:3)

我认为需要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