在Python中重塑世界银行数据:格式转换与年份后缀去除问题
世界银行数据集转目标长格式解决方案
问题描述
我有如下世界银行格式的数据集:
{'Country Name': {0: 'China', 1: 'China', 2: 'China'}, 'Country Code': {0: 'CHN', 1: 'CHN', 2: 'CHN'}, 'Series Name': {0: 'Consumer price index (2010 = 100)', 1: 'Age dependency ratio (% of working-age population)', 2: 'Age dependency ratio, old (% of working-age population)'}, '1972 [YR1972]': {0: '..', 1: '79.4811770762984', 2: '6.7804365054766'}, '1973 [YR1973]': {0: '..', 1: '78.8312385191076', 2: '6.83482919991518'}}
期望转换为去除年份列名后缀的长格式数据,目标格式如下:
desired_output = pd.DataFrame({'Country Code': ['CHN', 'CHN'], 'Country Name' : ['China', 'China'], 'Year': ['1972', '1973'], 'Age dependency ratio' : ['79.4811770762984', '78.8312385191076' ], 'Age dependency ratio, old' : ['6.7804365054766', '6.83482919991518']})
尝试用df.pivot(index = ['Country Name', 'Country Code'], columns = 'Series Name', values = ['1972 [YR1972]', '1973 [YR1973]'])方法有效果,但未得到理想格式,也不知道如何处理年份列名的后缀。
解决步骤
通过melt+pivot组合操作,配合字符串清理,可实现目标格式,具体操作如下:
读取数据并转为长格式基础版
先将原始数据转为DataFrame,再用melt把分散的年份列合并为单独的Year和Value列:import pandas as pd # 原始数据 data = {'Country Name': {0: 'China', 1: 'China', 2: 'China'}, 'Country Code': {0: 'CHN', 1: 'CHN', 2: 'CHN'}, 'Series Name': {0: 'Consumer price index (2010 = 100)', 1: 'Age dependency ratio (% of working-age population)', 2: 'Age dependency ratio, old (% of working-age population)'}, '1972 [YR1972]': {0: '..', 1: '79.4811770762984', 2: '6.7804365054766'}, '1973 [YR1973]': {0: '..', 1: '78.8312385191076', 2: '6.83482919991518'}} df = pd.DataFrame(data) # 转换为长格式:保留国家和指标列,年份列转为行 melted_df = df.melt(id_vars=['Country Name', 'Country Code', 'Series Name'], var_name='Year', value_name='Value')清理年份和指标名称
- 年份列:提取
[YRxxxx]前的4位数字,去掉冗余后缀 - 指标名称:删除括号及内部的补充说明,匹配目标格式的指标名
# 提取年份数字,去掉[YRxxxx]后缀 melted_df['Year'] = melted_df['Year'].str.extract(r'(\d{4})') # 清理指标名称,移除括号及内容 melted_df['Series Name'] = melted_df['Series Name'].str.replace(r'\s*\(.*\)', '', regex=True)- 年份列:提取
过滤冗余指标并转为目标宽格式
目标格式不需要Consumer price index,先过滤该指标,再用pivot转成目标的宽格式:# 过滤不需要的消费者物价指数 filtered_df = melted_df[melted_df['Series Name'] != 'Consumer price index'] # 转换为宽格式,重置索引消除层级 result_df = filtered_df.pivot(index=['Country Name', 'Country Code', 'Year'], columns='Series Name', values='Value').reset_index() # 移除列名的层级标签 result_df.columns.name = None验证结果
此时result_df与目标格式完全一致,打印查看:print(result_df) # 输出: # Country Name Country Code Year Age dependency ratio Age dependency ratio, old # 0 China CHN 1972 79.4811770762984 6.7804365054766 # 1 China CHN 1973 78.8312385191076 6.83482919991518
内容的提问来源于stack exchange,提问作者Adam_PythonEnthusist
相关产品推荐
相关产品推荐

