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

问题描述 投票:0回答:1

我正试图处理世界银行网站上的一个数据集,我需要重新调整数据集的形状,使系列名称成为第一行,年份的结构沿着一列排列。数据集中有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

我正在寻找一个快速的代码段来达到我的结果,而不需要太多耗时的逐列解决方案。谢谢!我正试图从世界银行网站上整理一个数据集,我需要用一种方法来重塑数据集。

python pandas reshape transpose data-wrangling
1个回答
1
投票

使用 DataFrame.set_index 用重塑的方式 DataFrame.stackSeries.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.meltDataFrame.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
© www.soinside.com 2019 - 2024. All rights reserved.