代码之家  ›  专栏  ›  技术社区  ›  Nicola

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

  •  0
  • Nicola  · 技术社区  · 4 年前

    我正试图从世界银行网站上整理一个数据集,我需要重新设计一种方式,使系列名称成为第一行,年份都沿着一列排列。数据集中有50年和100多个指标,因此这种重塑需要某种形式的自动化来为我工作。实际数据集的提取如下图所示。

    enter image description here

    为了简化重塑过程,我还分享了一个可重复的代码,以显示我在列和行之间的排列方面所考虑的过渡,如迄今为止以叙述形式所示。

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

    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
    

    enter image description here

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

    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
    

    enter image description here

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

    0 回复  |  直到 4 年前
        1
  •  1
  •   jezrael    4 年前

    使用 DataFrame.set_index 通过重塑 DataFrame.stack 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 具有 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