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

如何基于Pandas DataFrame生成pre/post分栏(多评分列场景)

高效实现DataFrame按时间关系重塑宽表

核心思路

利用Pandas的pivot方法一次性完成数据重塑,避免手动拆分合并的低效操作,适合大规模数据集处理。

步骤与代码实现

  1. 转换日期类型:确保date1和date2为datetime格式,保证时间比较的准确性
  2. 生成标识列:根据date2与date1的时间差,标记记录为pre(date2早于date1)或post(date2晚于date1)
  3. 数据重塑:通过pivot将长表转为宽表,自动合并列名
  4. 整理结果:重置索引并调整列顺序以匹配需求
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:52:39