如何将DataFrame转换为以唯一国家名为表头、年份为行的格式?
解决方案:DataFrame转置并填充幸福指数
需求说明
将长格式的原始DataFrame转换为以年份为行、国家为列的宽格式表,对应位置填充该年份-国家组合的幸福指数,缺失组合显示NaN。
原始数据定义
import pandas as pd import numpy as np data = { 'country_name': ['Afghanistan', 'Afghanistan', 'Afghanistan', 'Afghanistan', 'Afghanistan', 'Afghanistan', 'Afghanistan', 'Afghanistan', 'Afghanistan', 'Afghanistan', 'Afghanistan', 'Afghanistan', 'Afghanistan', 'Afghanistan', 'Albania', 'Albania', 'Albania', 'Albania', 'Albania', 'Albania', 'Albania', 'Albania', 'Albania', 'Albania', 'Albania', 'Albania', 'Albania', 'Albania'], 'year': [2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2021, 2022, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021], 'happiness_score' :[3.7235898971557617, 4.401778221130371, 4.758380889892578, 3.831719160079956, 3.782937526702881, 3.5721004009246826, 3.1308956146240234, 3.9828546047210693, 4.220168590545654, 2.6617181301116943, 2.694303274154663, 2.375091791152954, 2.4360344409942627, 1.2812711000442505, 4.634251594543457, 5.485469818115234, 5.268936634063721, 5.867421627044678, 5.510124206542969, 4.550647735595703, 4.81376314163208, 4.6066508293151855, 4.511100769042969, 4.639548301696777, 5.0044026374816895, 4.9953179359436035, 5.364909648895264, 5.255481719970703] } df = pd.DataFrame(data)
高效实现方法
无需手动构建空表再填充,直接使用Pandas内置的pivot或pivot_table方法即可一步完成:
方法1:使用pivot(无重复年份-国家组合时首选)
pivot会自动提取唯一年份作为行、唯一国家作为列,并填充对应幸福指数,缺失值自动设为NaN:
# 生成目标结构并填充数据 df_result = df.pivot(index='year', columns='country_name', values='happiness_score').reset_index() # 按年份排序(可选,确保顺序符合预期) df_result = df_result.sort_values('year').reset_index(drop=True)
方法2:使用pivot_table(处理重复年份-国家组合)
如果存在同一国家同一年份有多个幸福指数的情况,可通过aggfunc指定聚合方式(如均值、求和等):
df_result = df.pivot_table( index='year', columns='country_name', values='happiness_score', aggfunc='mean' # 可替换为'sum'/'first'等 ).reset_index().sort_values('year').reset_index(drop=True)
最终结果示例
转换后的表格结构如下(截取部分行):
| year | Afghanistan | Albania |
|---|---|---|
| 2007 | NaN | 4.634252 |
| 2008 | 3.723590 | NaN |
| 2009 | 4.401778 | 5.485470 |
| 2010 | 4.758381 | 5.268937 |
内容的提问来源于stack exchange,提问作者OranC
相关产品推荐
相关产品推荐

