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

如何高效为DataFrame每行按日期范围生成多行数据?

高效实现ID对应日期行扩展的方案

嘿,别用那种慢到离谱的循环啦!Pandas有专门的矢量化操作能完美搞定这个需求,性能提升不是一点点,下面给你两种实用的高效方案:

先准备原始数据和日期范围

首先我们先把示例里的原始数据和日期范围定义好:

import pandas as pd

# 你的原始DataFrame
df_old = pd.DataFrame({
    'ID': [123123, 123412, 123123, 234234, 432424],
    'data': [1, 1, 1, 2, 2]
})

# 指定需要扩展的日期范围(示例为2天,你可以改成7天或任意范围)
date_range = pd.date_range(start='2020-02-01', end='2020-02-02')

方案一:交叉连接(Cross Join)

通过构造一个日期DataFrame,和原始数据做笛卡尔积,快速生成所有ID+日期的组合:

# 创建仅包含日期的DataFrame
dates_df = pd.DataFrame({'date': date_range})

# 添加一个临时的连接键,用于实现交叉连接
df_old['temp_key'] = 1
dates_df['temp_key'] = 1

# 执行交叉连接,然后删除临时键
result = pd.merge(df_old, dates_df, on='temp_key').drop('temp_key', axis=1)

方案二:Assign + Explode(更简洁)

给每一行原始数据分配完整的日期列表,再通过explode方法把列表拆分成单独的行:

# 给每行分配日期范围列表,然后展开成多行
result = df_old.assign(date=[date_range]*len(df_old)).explode('date')

为什么这两种方法比循环高效?

  • 你原来的循环+append方法,每次循环都会创建新的DataFrame,时间复杂度是O(n²),数据量一大就会巨慢,而且df.append()已经被Pandas官方弃用了。
  • 上面的两种方法都是Pandas的矢量化操作,底层用C语言实现,避免了Python层面的循环,时间复杂度是O(n),处理大数据量时性能提升非常明显。

最终输出效果

运行完上面的代码后,result就是你想要的格式:

ID  data       date
0    123123     1 2020-02-01
1    123123     1 2020-02-02
2    123412     1 2020-02-01
3    123412     1 2020-02-02
4    123123     1 2020-02-01
5    123123     1 2020-02-02
6    234234     2 2020-02-01
7    234234     2 2020-02-02
8    432424     2 2020-02-01
9    432424     2 2020-02-02

内容的提问来源于stack exchange,提问作者YannickAaron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:22:44