在 Pandas 中熔化列分组

Melt column groupings in Pandas

我有一个如下所示的数据框:

df1 = pd.DataFrame([('company1',15,20,40,33,5, 9, 81, 34, 7), ('company2', 5,7,10,20,31, 14,18,37,42)],

              columns=['company','legs - dog', 'head - dog', 'tail - dog','legs - cat', 'head - cat', 'tail - cat','legs - rabbit', 'legs - rabbit', 'tail - rabbit'])

我希望输出是这样的:

df2 = pd.DataFrame([('company1','dog', 15,20,40), ('company1','cat', 33,5,9),('company1','rabbit', 81,34,7),('company2','dog', 5,7,10), ('company2','cat', 20,31,14), ('company2','rabbit', 18,37,42) ],

              columns=['company','animal', 'legs', 'head','tail'])

我想将 df1 中的第一列保留为 df2 中的第一列。 df1 中的其他列分组(在这种情况下,每组三列)。

这些组中的列标题具有我需要拆分的复合列名称。例如,df1 中的第二列具有标签 'legs - dog'。分组列的每个名称都是字符串,由“-”分隔。我需要连字符之前的字符串的第一部分(在本例中为 'legs')成为列名,而 df1 中分组列名的字符串的第二部分(在本例中为 'dog')成为列名为 'animals'.

的新行的元素

如果您能帮助找到解决方案,我们将不胜感激。谢谢!

pd.wide_to_long

我们可以在此处使用 pd.wide_to_long 函数,它是 pandas melt 函数的替代方法,并且在将数据帧从 wide 格式转换时更加用户友好 长格式。

pd.wide_to_long(df1, i='company', j='animal', 
                stubnames=['legs', 'tail', 'head'], 
                sep=' - ', suffix='\w+')\
  .reset_index()

    company  animal  legs  tail  head
0  company1     dog    15    40    20
1  company2     dog     5    10     7
2  company1     cat    33     9     5
3  company2     cat    20    14    31
4  company1  rabbit    81     7    34
5  company2  rabbit    18    42    37