我有一个Pandas df,其中一列(Reservation_Dt_Start)代表日期范围的开始,另一列(Reservation_Dt_End)代表日期范围的结束。
我希望将每一行扩展为具有与该日期范围内的日期一样多的记录,而不是每行都有一个日期范围,而每行都代表这些日期之一。
有关示例输入和所需的输出,请参见下面的两个图片。
下面的代码段有效!!但是,对于输入表中的每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)
必须有一种更快的方法来执行此操作。有任何想法吗?谢谢!
答案 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'])