如何高效为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
相关产品推荐
相关产品推荐

