pandas 将具有不同名称的多个列上的dataframe从宽格式转换为长格式

kdfy810k  于 2023-03-21  发布在  其他
关注(0)|答案(1)|浏览(116)

我有一个形状为500 x200的数据框,我想根据列的子集来透视/融合它。下面是一个示例测试数据框,其中我有一个id列,三个case列,以及每个id的数据的附加列。

pd.DataFrame({'id': [1,2], 'case1': [3,1], 'case2': [3,2], 'case3': [3,2], 'vpd': [2,1]})

    id  case1 case2 case3 vpd
0   1   3     3     3     2
1   2   1     2     2     1

我想只在case列上旋转,像这样:

pd.DataFrame({'index': ['case1', 'case2', 'case3', 'case1', 'case2', 'case3'], 'id': [1,1,1,2,2,2], 'vpd': [2,2,2,1,1,1],
             'case': [3,3,3,1,2,2]}).set_index('index')
        id vpd case
index           
case1   1   2   3
case2   1   2   3
case3   1   2   3
case1   2   1   1
case2   2   1   2
case3   2   1   2

其中每个case列成为透视数据框中的一行。这似乎达到了我想要的效果:

pd.wide_to_long(test_df, "case", i="id", j="case#").reset_index()
    id  case#   vpd case
0   1   1       2   3
1   2   1       1   1
2   1   2       2   3
3   2   2       1   2
4   1   3       2   3
5   2   3       1   2

但不完全是。还有什么其他的想法来达到我想要的输出吗?

6rqinv9w

6rqinv9w1#

您可以使用melt

>>> (df.melt(['id', 'vpd'], var_name='case#', value_name='case', ignore_index=False)
       .set_index('case#'))

       id  vpd  case
case#               
case1   1    2     3
case1   2    1     1
case2   1    2     3
case2   2    1     2
case3   1    2     3
case3   2    1     2

要保持顺序,请使用stack

>>> (df.set_index(['id', 'vpd']).stack()
       .rename('case').reset_index(['id', 'vpd']))

       id  vpd  case
case1   1    2     3
case2   1    2     3
case3   1    2     3
case1   2    1     1
case2   2    1     2
case3   2    1     2

相关问题