Python 将groupedby数据帧(多列但不是所有列)从长到宽进行转换

Python 将groupedby数据帧(多列但不是所有列)从长到宽进行转换,python,pandas,dataframe,pandas-groupby,transformation,Python,Pandas,Dataframe,Pandas Groupby,Transformation,问题: 我有一个不同公司的年度数据集。数据以长格式存储,每年是一行,因此公司ID是重复的。 数据看起来像这样(但是在原始数据框中,我有更多的列) 我需要将长型格式转换为宽型格式,这样每个公司将显示在一行中(无重复) 这就是我希望看到的结果: 如你所见,我需要: 一些列(如“年”)不再需要 一些列(如“销售”、“销售2年内的变化”、“销售1年内的变化”)应从宽格式转换为长格式,并保留其名称(并在其中添加数字) 一些列(如“ind1”和“ind2”)应该保持原样(没有从宽到长的转换) 到目前

问题:

我有一个不同公司的年度数据集。数据以长格式存储,每年是一行,因此公司ID是重复的。 数据看起来像这样(但是在原始数据框中,我有更多的列)

我需要将长型格式转换为宽型格式,这样每个公司将显示在一行中(无重复)

这就是我希望看到的结果:

如你所见,我需要:

  • 一些列(如“年”)不再需要

  • 一些列(如“销售”、“销售2年内的变化”、“销售1年内的变化”)应从宽格式转换为长格式,并保留其名称(并在其中添加数字)

  • 一些列(如“ind1”和“ind2”)应该保持原样(没有从宽到长的转换)

到目前为止,我能够制定一个解决方案,它只对一列工作,所以它真的不是我的解决方案

这是我的代码:

test.groupby("comp_id")['sales_change_1'].apply(list).apply(pd.Series).rename(columns=lambda x: 'sales_{}'.format(x+1))

我的问题有更好的解决方法吗?

在你放弃这些年后:

del test['Year']
您可以通过为属于同一公司的每一行添加一个额外的列和行“index”来将行分组在一起

test['idx'] = test.groupby('Comp_id').cumcount() + 1
然后将其设置为数据帧索引的一部分,并使用
unstack()
将其转换为列

test = test.set_index(['Comp_id', 'idx']).unstack()
此时,您的列将是一个多索引,其中创建的
'idx'
作为第二级,因此您可以使用DataFrame,因为它将列引用为
('Sales',1)
('Sales',2)
,等等

如果要使用下划线作为分隔符展平列,可以使用以下命令:

test.columns = ['{}_{}'.format(col, idx) for (col, idx) in test.columns]

在你放弃这些年之后:

del test['Year']
您可以通过为属于同一公司的每一行添加一个额外的列和行“index”来将行分组在一起

test['idx'] = test.groupby('Comp_id').cumcount() + 1
然后将其设置为数据帧索引的一部分,并使用
unstack()
将其转换为列

test = test.set_index(['Comp_id', 'idx']).unstack()
此时,您的列将是一个多索引,其中创建的
'idx'
作为第二级,因此您可以使用DataFrame,因为它将列引用为
('Sales',1)
('Sales',2)
,等等

如果要使用下划线作为分隔符展平列,可以使用以下命令:

test.columns = ['{}_{}'.format(col, idx) for (col, idx) in test.columns]