熊猫-日期范围内每天的新行

时间:2018-12-06 19:08:41

标签: python pandas

我有一个Pandas df,其中一列(Reservation_Dt_Start)代表日期范围的开始,另一列(Reservation_Dt_End)代表日期范围的结束。

我希望将每一行扩展为具有与该日期范围内的日期一样多的记录,而不是每行都有一个日期范围,而每行都代表这些日期之一。

有关示例输入和所需的输出,请参见下面的两个图片。

Input Output

下面的代码段有效!!但是,对于输入表中的每250行,需要1秒才能运行。鉴于我的输入表的大小为1.2亿行,因此这段代码将花费大约一周的时间。

pd.concat([pd.DataFrame({'Book_Dt': row.Book_Dt,
                         'Day_Of_Reservation': pd.date_range(row.Reservation_Dt_Start, row.Reservation_Dt_End),
                         'Pickup': row.Pickup,
                         'Dropoff' : row.Dropoff,
                         'Price': row.Price}, 

                          columns=['Book_Dt','Day_Of_Reservation', 'Pickup', 'Dropoff' , 'Price']) 
                          for i, row in df.iterrows()], ignore_index=True)

必须有一种更快的方法来执行此操作。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

pd.concat在具有大型数据集的循环中变得非常慢,因为它将每次都复制该帧并返回一个新的数据帧。您正在尝试执行此操作1.2亿次。我会尝试将这些数据作为一个简单的元组列表使用,而不是在最后转换为数据框。

例如

给出列表list = []

对于数据框中的每一行:

  • 获取日期范围列表(可以在此处仍然使用pd.date_range)存储在变量dates中,该变量是日期列表

  • 对于日期范围内的每个日期,在列表list.append((row.Book_Dt, dates[i], row.Pickup, row.Dropoff, row.Price))

  • 中添加一个元组

最后,您可以将元组列表转换为数据框:

df = pd.DataFrame(list, columns = ['Book_Dt', 'Day_Of_Reservation', 'Pickup', 'Dropoff', 'Price'])

相关问题