如何优雅地将长格式Pandas DataFrame转换为指定宽格式?
Pandas长表转宽表:优雅实现滞后日期格式转换
不用写for循环,用Pandas的分组和移位方法就能高效搞定需求,具体步骤如下:
步骤1:预处理数据(转换日期+排序)
先把日期列转为datetime类型,再按地区和日期排序,确保分组后滞后值的顺序正确:
import pandas as pd data = {'regions':["USA", "USA", "USA", "FRANCE", "FRANCE","FRANCE"], 'dates':['2024-08-03', '2024-08-10', '2024-08-17','2024-08-03', '2024-08-10', '2024-08-17'], 'values': [3, 4, 5, 7, 8,0], } df = pd.DataFrame(data) # 转换日期格式并按地区、日期排序 df['dates'] = pd.to_datetime(df['dates']) df = df.sort_values(['regions', 'dates']).reset_index(drop=True)
步骤2:生成滞后列
通过groupby结合shift方法,为每个地区生成对应的滞后值:
# 按地区分组,生成1期和2期滞后值 df['values_lag1'] = df.groupby('regions')['values'].shift(1) df['values_lag2'] = df.groupby('regions')['values'].shift(2)
步骤3:筛选最新日期记录并整理列顺序
用groupby('regions').last()直接提取每个地区的最新日期行,最后调整列顺序匹配预期输出:
# 筛选每组最新日期的记录 result = df.groupby('regions').last().reset_index() # 调整列顺序 result = result[['regions', 'dates', 'values_lag2', 'values_lag1', 'values']] # 查看结果 print(result)
输出结果
regions dates values_lag2 values_lag1 values 0 FRANCE 2024-08-17 7.0 8.0 0 1 USA 2024-08-17 3.0 4.0 5
这种方法基于Pandas的向量化操作,比手动for循环效率高很多,尤其适合处理大规模数据集。
内容的提问来源于stack exchange,提问作者new world
相关产品推荐
相关产品推荐

