如何基于Pandas DataFrame生成pre/post分栏(多评分列场景)
高效实现DataFrame按时间关系重塑宽表
核心思路
利用Pandas的pivot方法一次性完成数据重塑,避免手动拆分合并的低效操作,适合大规模数据集处理。
步骤与代码实现
- 转换日期类型:确保
date1和date2为datetime格式,保证时间比较的准确性 - 生成标识列:根据
date2与date1的时间差,标记记录为pre(date2早于date1)或post(date2晚于date1) - 数据重塑:通过
pivot将长表转为宽表,自动合并列名 - 整理结果:重置索引并调整列顺序以匹配需求
import pandas as pd import numpy as np # 构造样本数据 data = { 'id': [101, 101, 102, 102, 103], 'date1': ['2021-10-01', '2021-10-01', '2022-11-01', '2022-11-01', '2021-10-01'], 'score1': [50, 40, 30, 35, 30], 'score2': [70, 75, 50, 55, 40], 'date2': ['2021-09-01', '2021-11-01', '2022-09-01', '2023-01-01', '2021-11-01'] } df = pd.DataFrame(data) # 转换日期类型 df['date1'] = pd.to_datetime(df['date1']) df['date2'] = pd.to_datetime(df['date2']) # 生成pre/post标识 df['flag'] = np.where(df['date2'] < df['date1'], 'pre', 'post') # 执行pivot重塑 result = df.pivot(index=['id', 'date1'], columns='flag', values=['score1', 'score2', 'date2']) # 合并列名(如score1与pre合并为score1_pre) result.columns = [f'{col[0]}_{col[1]}' for col in result.columns] # 重置索引,将id和date1从索引转为列 result = result.reset_index() # 调整列顺序匹配需求 result = result[['id', 'date1', 'score1_pre', 'score1_post', 'score2_pre', 'score2_post', 'date2_pre', 'date2_post']] print(result)
输出结果
id date1 score1_pre score1_post score2_pre score2_post date2_pre date2_post 0 101 2021-10-01 50.0 40.0 70.0 75.0 2021-09-01 2021-11-01 1 102 2022-11-01 30.0 35.0 50.0 55.0 2022-09-01 2023-01-01 2 103 2021-10-01 NaN 30.0 NaN 40.0 NaT 2021-11-01
优势说明
- 无需手动拆分合并DataFrame,减少内存开销与冗余操作
- 依托Pandas内部优化的
pivot方法,处理大规模数据时效率远高于手动拆分逻辑 - 自动处理缺失值(如id103的pre字段),无需额外判断逻辑
内容的提问来源于stack exchange,提问作者mockash
相关产品推荐
相关产品推荐

