我有一个数据框架,目前看起来像这样:
Year Country Subject Descriptor GDP
0 2015 Austria r 344.2
1 2015 Austria n 344.2
2 2015 Austria d 100
3 2015 Austria u 5.742
4 2015 Belgium r 416.7
5 2015 Belgium n 416.7
6 2015 Belgium d 100
7 2015 Belgium u 8.483
我想让它看起来像这样:
Year Country GDP_R GDP_N GDP_D GDP_U
2015 Austria 344.2 344.2 100 5.742
2015 Belgium 416.7 416.7 100 8.483
到目前为止,我已经尝试使用melt和stack,但我觉得我只是错过了它,如果你能在这里帮助我,我将不胜感激。
谢谢!
您可以首先使用groupby.agg()
并将GDP列的所有值放在一个列表中。然后,您可以将对象转换为新的DataFrame,使用前缀'GDP_'和Subject Descriptor列的所有值作为列。
最后,使用pd.concat()
将两者放在一起将得到最终输出。
请参见下面的示例:
one = df.groupby(['Year','Country'])['GDP'].agg(list).reset_index()
two = pd.DataFrame(one['GDP'].to_list(), columns=['GDP_' + s.upper() for s in set(df['Subject Descriptor'].tolist())])
new = pd.concat([one,two],axis=1).drop('GDP',axis=1)
new
print back:
Year Country GDP_D GDP_N GDP_R GDP_U
0 2015 Austria 344.2 344.2 100.0 5.742
1 2015 Belgium 416.7 416.7 100.0 8.483
首先您可以在['Year', 'Country']
上使用groupby
,然后您可以将每个组的gdp转换为列表,然后将它们转置为列。最后几个步骤是重命名列,重置索引和删除列轴名称。
(
df.groupby(['Year', 'Country'])
.apply(lambda x: pd.Series(x.GDP.tolist(), index=x['Subject Descriptor']))
.rename(columns = lambda x: f'GDP_{x.upper()}')
.reset_index()
.rename_axis('', axis=1)
)
在这种情况下可以使用枢轴:
(df.pivot(['Year', 'Country'], 'Subject_Descriptor', 'GDP')
.rename(columns = lambda col: f"GDP_{col.upper()}")
.rename_axis(columns=None).reset_index()
)
Year Country GDP_D GDP_N GDP_R GDP_U
0 2015 Austria 100.0 344.2 344.2 5.742
1 2015 Belgium 100.0 416.7 416.7 8.483