在Python中重塑Eurostat宽格式数据:时间列转行、na_item转列
解决方案
你的需求是将行=na_item、列=季度数值的DataFrame转换为行=季度、列=各na_item数值的结构,之前用pd.melt只得到了长格式数据,需要结合后续操作实现目标,以下是两种可行方案:
方案一:melt + pivot(通用场景)
适用于原始数据包含多个维度列(如geo、unit、s_adj)的情况,步骤如下:
- 先将季度列转成长格式(每行对应一个na_item+时间+数值):
# 提取所有非时间维度列作为id_vars,自动识别所有时间列作为value_vars melted_data = pd.melt( data, id_vars=['na_item', 'geo', 'unit', 's_adj'], var_name='time', value_name='millions' )
- 将长格式数据转成目标宽格式:
# 以time为行索引,na_item为列,数值为值 result = melted_data.pivot( index='time', columns='na_item', values='millions' ).reset_index() # 如果需要保留geo/unit/s_adj等固定维度列,可调整索引: # result = melted_data.pivot( # index=['time', 'geo', 'unit', 's_adj'], # columns='na_item', # values='millions' # ).reset_index()
方案二:直接转置(简化场景)
由于你的筛选条件中geo、unit、s_adj都是单一固定值(SE、CP_MEUR、NSA),可以直接转置实现:
# 设置na_item为索引,移除无关维度列 temp_data = data.set_index('na_item').drop(['geo', 'unit', 's_adj'], axis=1) # 转置后重置索引,重命名时间列 result = temp_data.T.reset_index().rename(columns={'index': 'time'})
结果说明
最终result的结构为:每行对应一个季度(如2019-Q1),列包含B1GQ、P3、P6、P7、D2的对应数值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者cfolder umt
相关产品推荐
相关产品推荐

