如何通过考虑大型数据集中的选定列和行来重塑或转置数据集(世界银行示例)

How to reshape or transpose a dataset by considering selected columns and rows in a large dataset (World Bank example)

我正在尝试整理来自世界银行网站的数据集,我需要以一种方式进行重塑,以使系列名称成为第一行,而年份则全部按列排列。数据集中有 50 年和 100 多个指标,因此这种重塑需要某种形式的自动化才能为我工作。实际数据集的摘录如下图所示。

为了简化重塑过程,我还共享了一个可重现的代码,以显示我在列和行之间的排列方面所想到的过渡,如目前以叙述形式所示。

请注意:可重现的代码并不是输出的完美表示,因为它被简化了很多,实际使用的数据集有数百个指标和数百个国家

import pandas as pd
data = {'Country':  ['Argentina', 'Argentina', 'Albania','Albania','Cuba','Cuba'],
        'Series': ['Indicator 1', 'Indicator 2', 'Indicator 1', 'Indicator 2','Indicator 1', 'Indicator 2', ],
        '2014': [1, 2, 3,4,5,6],
        '2015': [2, 4, 1,2,3,4]}
df = pd.DataFrame (data, columns = ['Country','Series','2014','2015'])
df

我想使用一个片段来达到这个结构,如代码下方的输出所示

import pandas as pd
data = {'Country':  ['Argentina', 'Argentina', 'Albania','Albania','Cuba','Cuba'],
        'Year': [2014,2015,2014,2015,2014,2015],
        'Indicator 1': [1, 2,3,1,5,3],
        'Indicator 2': [2,4,4,2,6,4]}
df = pd.DataFrame (data, columns = ['Country','Year','Indicator 1','Indicator 2'])
df

我正在寻找一个快速片段来获得我的结果,而不需要太多时间逐列解决方案。谢谢!

使用DataFrame.set_index with reshape by DataFrame.stack and Series.unstack:

df1 = (df.set_index(['Country','Series'])
         .stack()
         .unstack(1)
         .rename_axis(columns=None, index=('Country','Year'))
         .reset_index())
print (df1)
     Country  Year  Indicator 1  Indicator 2
0    Albania  2014            3            4
1    Albania  2015            1            2
2  Argentina  2014            1            2
3  Argentina  2015            2            4
4       Cuba  2014            5            6
5       Cuba  2015            3            4

如果因为重复使用 DataFrame.melt with DataFrame.pivot_table 而无法正常工作(可能的重复由 mean 聚合):

df1 = (df.melt(['Country','Series'], var_name='Year')
         .pivot_table(index=['Country','Year'], 
                      columns='Series', 
                      values='value',
                      aggfunc='mean')
         .rename_axis(columns=None, index=('Country','Year'))
         .reset_index()
         )
print (df1)
     Country  Year  Indicator 1  Indicator 2
0    Albania  2014            3            4
1    Albania  2015            1            2
2  Argentina  2014            1            2
3  Argentina  2015            2            4
4       Cuba  2014            5            6
5       Cuba  2015            3            4