如何通过考虑大型数据集中的选定列和行来重塑或转置数据集(世界银行示例)
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
我正在尝试整理来自世界银行网站的数据集,我需要以一种方式进行重塑,以使系列名称成为第一行,而年份则全部按列排列。数据集中有 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