如何将多组列传递给行?

时间:2017-01-04 19:28:00

标签: python pandas

这是my previous question的延续。

我有数据集:

df = 
ID   GROUP_1   GROUP_2    GROUP_3   COUNT   NAME_1   NAME_2
1    AAA       AAA        CCC       5       xxx      yyy
2    BBB       CCC        AAA       6       yyy      zzz

结果应该是这个:

new =
ID   GROUP  COUNT  NAME
1    AAA    5      xxx
1    AAA    5      yyy
1    CCC    5      xxx
1    CCC    5      yyy
2    BBB    6      yyy
2    BBB    6      zzz
2    CCC    6      yyy
2    CCC    6      zzz
2    AAA    6      yyy
2    AAA    6      zzz

我想将GROUP_1,GROUP_2和GROUP_3,AND NAME_1NAME_2的值传入行(考虑以GROUPNAME开头的列数很大,所以我不想手动枚举它们。)

我目前正在使用上一个问题中提出的解决方案:

cols = ['ID', 'GROUP', 'COUNT', 'NAME']
df.set_index(['ID', 'COUNT', 'NAME']).stack().reset_index(name='GROUP')[cols]

然而,问题是我应该对NAME应用相同的程序。考虑到应该将多组列传递给行,是否可以更新此解决方案?

1 个答案:

答案 0 :(得分:0)

您可以使用与上一个答案相同的方法使用melt两次

首先将NAME列熔化为一列

df1 = pd.melt(
    df, ['ID', 'COUNT', 'GROUP_1', 'GROUP_2', 'GROUP_3'],
    ['NAME_1', 'NAME_2'],
    value_name='NAME').drop('variable', axis=1)

输出

   ID  COUNT GROUP_1 GROUP_2 GROUP_3 NAME
0   1      5     AAA     AAA     CCC  xxx
1   2      6     BBB     CCC     AAA  yyy
2   1      5     AAA     AAA     CCC  yyy
3   2      6     BBB     CCC     AAA  zzz

然后通过GROUP列

再次融化这个
df2 = pd.melt(
    df1, ['ID', 'COUNT', 'NAME'],
    ['GROUP_1', 'GROUP_2', 'GROUP_3'],
    value_name='GROUP').drop('variable', axis=1).drop_duplicates()

输出

    ID  COUNT NAME GROUP
0    1      5  xxx   AAA
1    2      6  yyy   BBB
2    1      5  yyy   AAA
3    2      6  zzz   BBB
5    2      6  yyy   CCC
7    2      6  zzz   CCC
8    1      5  xxx   CCC
9    2      6  yyy   AAA
10   1      5  yyy   CCC
11   2      6  zzz   AAA