You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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组合操作,配合字符串清理,可实现目标格式,具体操作如下:

  1. 读取数据并转为长格式基础版
    先将原始数据转为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')
    
  2. 清理年份和指标名称

    • 年份列:提取[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)
    
  3. 过滤冗余指标并转为目标宽格式
    目标格式不需要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
    
  4. 验证结果
    此时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:25:14