使用pandas从行创建一组列



我有一个数据框架,目前看起来像这样:

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)

newprint 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

最新更新