如何转换Pandas DataFrame:合并年份列并拆分Series Name为多列
解决方案
你可以通过pandas的**融化(melt)和透视(pivot)**操作实现这个数据结构转换,步骤如下:
1. 数据准备与清洗
先导入pandas库,将你提供的字典转为DataFrame,并把原始数据中的'..'替换为标准缺失值,同时把年份列转为浮点型:
import pandas as pd # 你的原始数据字典 data = {'Country Name': {0: 'Argentina', 1: 'Argentina', 2: 'Argentina'}, 'Series Name': {0: 'CO2 emissions (metric tons per capita)', 1: 'Electric power consumption (kWh per capita)', 2: 'Energy use (kg of oil equivalent per capita)'}, '2010': {0: '4.0998122679475', 1: '2877.65265331343', 2: '1928.65235658729'}, '2011': {0: '4.28094332027273', 1: '2929.07502855568', 2: '1952.05105293095'}, '2012': {0: '4.26422362148416', 1: '3000.60352326565', 2: '1936.80353979442'}, '2013': {0: '4.34212454655109', 1: '2967.37655805218', 2: '1967.02167752077'}, '2014': {0: '4.20905330505396', 1: '3074.70207056563', 2: '2029.92282543737'}, '2015': {0: '4.30185120706067', 1: '..', 2: '..'}, '2016': {0: '4.20180210453832', 1: '..', 2: '..'}, '2017': {0: '4.07139674183186', 1: '..', 2: '..'}, '2018': {0: '3.9756664767256', 1: '..', 2: '..'}, '2019': {0: '3.74054556792816', 1: '..', 2: '..'}, '2020': {0: '..', 1: '..', 2: '..'}, '2021': {0: '..', 1: '..', 2: '..'}, '2022': {0: '..', 1: '..', 2: '..'}} df = pd.DataFrame(data) # 替换缺失值标记为标准NA df = df.replace('..', pd.NA) # 提取年份列并转为浮点型 year_cols = df.filter(regex='^\d{4}$').columns df[year_cols] = df[year_cols].astype(float)
2. 融化年份列
用melt函数把所有年份列合并成单一Year列,保留Country Name和Series Name作为标识项:
melted_df = df.melt( id_vars=['Country Name', 'Series Name'], value_vars=year_cols, var_name='Year', value_name='Value' )
3. 透视生成目标结构
通过pivot将Series Name的唯一值转为独立列,以Country Name和Year作为索引,最后重置索引让索引列变为普通列:
result_df = melted_df.pivot( index=['Country Name', 'Year'], columns='Series Name', values='Value' ).reset_index() # 可选:简化列名(去掉括号内的说明文字) result_df.columns = [col.split(' (')[0] if ' (' in col else col for col in result_df.columns]
执行后得到的result_df就是你要的结构,示例输出如下:
Country Name Year CO2 emissions Electric power consumption Energy use 0 Argentina 2010 4.099812 2877.652653 1928.652357 1 Argentina 2011 4.280943 2929.075029 1952.051053 2 Argentina 2012 4.264224 3000.603523 1936.803540 ...
内容的提问来源于stack exchange,提问作者Brie MerryWeather
相关产品推荐
相关产品推荐

