如何从Pandas DataFrame中按年份提取行并转为列
问题:按年份重构Pandas DataFrame
我有一个以Pandas datetime类型为索引的DataFrame,包含2004年至2015年的温度极值数据(实际数据约16万行),简化版示例如下:
| id | data_c ------------|---------------|--------------- date | | 2005-01-01 | USW00004848 | -17.777778 2005-01-02 | USC00207320 | 65.555556 2005-01-03 | USC00207320 | -23.888889 2006-01-01 | USW00014833 | -42.222222 2006-01-02 | USW00014833 | 0.555556 2006-12-31 | USC00200032 | -11.666667 2007-12-29 | USC00205050 | -27.222222 2007-12-30 | USC00208202 | -17.777778 2007-12-31 | USC00201250 | -21.111111 2008-12-3 | USC00200230 | -27.222222 2008-01-4 | USW00004848 | -17.777778 2008-01-5 | USC00207320 | 65.555556 2009-01-01 | USC00207320 | -23.888889 2009-01-02 | USW00014833 | -42.222222 2009-01-03 | USW00014833 | 0.555556 2010-12-3 | USC00200032 | -11.666667 2010-12-4 | USC00205050 | -27.222222 2010-12-5 | USC00208202 | -17.777778
我希望按年份提取行数据,并将对应值作为新列添加到同一个DataFrame中,最终效果如下:
2005 2006 2007 2008 2009 0 -17.777778 -42.222222 -27.222222 -27.222222 -23.888889 1 65.555556 0.555556 -17.777778 -17.777778 -42.222222 2 -23.888889 -11.666667 -21.111111 65.555556 0.555556
已知可以通过df.index.year==2005逐年手动筛选添加列,但想找更简便的方法。
解决方案
可以利用Pandas的groupby结合cumcount生成组内序号,再用pivot完成列转行的操作,步骤如下:
- 提取索引的年份作为新列
year - 为每个年份内的行生成连续序号
idx(用于后续转列时对齐) - 使用
pivot将年份转为列,序号作为索引,data_c作为值
完整代码:
import pandas as pd # 假设你的DataFrame名为df df['year'] = df.index.year df['idx'] = df.groupby('year').cumcount() result = df.pivot(index='idx', columns='year', values='data_c') # 如果需要去掉列名的名称(即"year"这个表头),可以加上: result.columns.name = None print(result)
代码说明:
df.index.year直接从datetime索引提取年份,无需手动判断groupby('year').cumcount()为每个年份组内的行从0开始计数,保证同一年份的行按原有顺序生成序号pivot函数自动将不同年份的data_c值按序号对齐,生成目标格式的DataFrame- 最后去掉列名的名称是为了和你期望的输出格式一致
这种方法无需手动遍历年份,代码简洁且效率高,适合处理大体积数据(比如你的16万行数据)。
内容的提问来源于stack exchange,提问作者johnny gabritchidze
相关产品推荐
相关产品推荐

