You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅地将长格式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:09:55