如何将多城市年度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
相关产品推荐
相关产品推荐

