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

如何将多城市年度GDP数据整理为指定格式?求可行方法与函数

数据格式转换:宽表转分组缩进格式的实现方案

我需要整理不同城市各年度的GDP(单位:billion dollars)数据,原始宽表格式如下:

year   york Syd ACT Mel
2016    236 231 234 254
2017    236 231 234 254
2018    236 231 234 254
2019    236 231 234 254

期望转换为以下分组缩进的格式:

city    year    gdp(billion dollar)
york    2016    236
        2017    236
        2018    236
        2019    236
Syd     2016    231
        2017    231
        2018    231
        2019    231

核心思路:宽表转长表 + 分组格式化输出

先把每列对应一个城市的宽格式表格,转换为每行对应「城市-年份-GDP」的长格式,再按城市分组,对组内非首行添加缩进即可。以下是几种实用的实现方式:

1. Python + Pandas 实现(灵活可控)

Pandas是处理表格数据的常用工具,步骤清晰易调整:

  • 读取原始数据解析为DataFrame
  • 用melt()函数完成宽表转长表
  • 按城市分组遍历,首行输出城市名,后续行仅保留年份和GDP并添加缩进

代码示例:

import pandas as pd

# 读取原始数据(实际场景可替换为pd.read_csv/pd.read_table读取本地文件)
raw_data = """year   york Syd ACT Mel
2016    236 231 234 254
2017    236 231 234 254
2018    236 231 234 254
2019    236 231 234 254"""
df = pd.read_table(pd.io.common.StringIO(raw_data), sep=r'\s+')

# 宽表转长表
long_df = df.melt(id_vars='year', var_name='city', value_name='gdp(billion dollar)')

# 格式化输出
print("city    year    gdp(billion dollar)")
for city, group in long_df.groupby('city'):
    is_first_row = True
    for _, row in group.iterrows():
        if is_first_row:
            print(f"{city:<6}{row['year']:<8}{row['gdp(billion dollar)']}")
            is_first_row = False
        else:
            print(f"        {row['year']:<8}{row['gdp(billion dollar)']}")

注:<6>和<8>是字符串对齐参数,可根据需求调整缩进和列宽。

2. Shell + Awk 实现(命令行快速处理)

如果习惯用命令行处理文本文件,Awk可以高效完成转换:

BEGIN {
    print "city    year    gdp(billion dollar)"
}
NR==1 {
    # 提取第一行的城市名(从第2列开始)
    for(i=2; i<=NF; i++) cities[i-1] = $i
    next
}
{
    # 存储每个城市对应年份的GDP
    curr_year = $1
    for(i=2; i<=NF; i++) {
        city = cities[i-1]
        gdp = $i
        record[city][curr_year] = gdp
    }
}
END {
    # 按城市分组输出
    for(city in record) {
        first_line = 1
        for(year in record[city]) {
            if(first_line) {
                printf "%-6s%-8s%s\n", city, year, record[city][year]
                first_line = 0
            } else {
                printf "        %-8s%s\n", year, record[city][year]
            }
        }
    }
}

使用方式:将代码保存为format_gdp.awk,执行awk -f format_gdp.awk 你的数据文件名.txt即可。

3. Excel 实现(非编程场景)

  • 第一步:宽表转长表:选中数据 → 「数据」选项卡 → 「从表格/范围」进入Power Query → 「转换」选项卡 → 选择year列后点击「逆透视其他列」,完成后加载回Excel。
  • 第二步:添加缩进格式:按城市排序后,新增一列写公式=IF(A2=A1,"",A2)(假设城市列在A列),筛选出空值单元格设置缩进格式,或手动添加空格即可。

内容的提问来源于stack exchange,提问作者Harry Huang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:05:26