Pandas中实现数据行列转置(pivot/melt)的技术求助
Pandas中实现数据行列转置(pivot/melt)的技术求助
嘿,我懂你这种搞不清pivot和melt用法的困惑!其实你要的这种把年份转成列、指标(cumul/evolution/nb/pct)转成行的需求,用Pandas很容易实现,我给你两种靠谱的方法,一步步来~
首先先确认下你的原始数据(方便对照):
import pandas as pd import numpy as np data = {'year': [2023, 2022, 2021, 2020, 2019, 2018, 2017, 2016, 2015, 2014], 'cumul': [0.0, 77.0, 100.0, -200.0, 114.0, -11.0, -27.0, 89.0, 195.0, -18.0], 'evolution': [14.4, -10.3, 28.0, -8.1, 27.5, -10.5, 8.8, 7.5, 10.0, 1.1], 'nb': [0, 3, 1, 2, 3, 1, 1, 3, 7, 2], 'pct': [np.nan, 26.0, 100.0, -100.0, 38.0, -11.0, -27.0, 30.0, 28.0, -9.0]} df = pd.DataFrame(data)
方法1:直接转置(简洁高效,适合全指标转置)
这种方法适合你需要把所有指标都转成行的场景,步骤很简单:
- 把
year列设置为DataFrame的索引 - 用
transpose()方法直接转置行列 - 重置索引并调整列名让结果更清晰
代码实现:
# 设置year为索引,然后转置 df_transposed = df.set_index('year').transpose() # 重置索引,把原来的指标名从索引变成一列 df_transposed = df_transposed.reset_index() # 给列重命名,让结果更易读 df_transposed.rename(columns={'index': '指标'}, inplace=True) # 查看结果 print(df_transposed)
运行后你就能得到:行是cumul/evolution/nb/pct,列是各个年份的格式,完全符合你的需求~
方法2:melt + pivot(灵活可控,适合复杂场景)
如果之后你需要只转置部分指标,或者处理更复杂的多维度数据,melt+pivot的组合会更灵活:
- 先用
melt把宽格式的数据转成“长格式”:保留year列,把其他指标列拆成“指标名”和“对应数值”两列 - 再用
pivot把长格式转回你要的宽格式:以“指标名”为行,“年份”为列,填充对应数值
代码实现:
# 第一步:melt转长格式 df_melted = df.melt( id_vars='year', # 保留不转的列 var_name='指标', # 原来的列名变成新列的名字 value_name='数值' # 原来的数值对应的列名 ) # 第二步:pivot转成目标格式 df_pivoted = df_melted.pivot( index='指标', # 作为行的列 columns='year', # 作为列的列 values='数值' # 填充的数值列 ).reset_index() # 查看结果 print(df_pivoted)
比如如果你只想转置cumul和evolution,只需要在melt里加个value_vars=['cumul', 'evolution']参数就行,非常灵活~
备注:内容来源于stack exchange,提问作者Johann
相关产品推荐
相关产品推荐

