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