我有一个 Pandas df,其中一列 (Reservation_Dt_Start) 表示日期范围的开始,另一列 (Reservation_Dt_End) 表示日期范围的结束。
我不想每行都有一个日期范围,而是希望扩展每行以包含与日期范围中的日期一样多的记录,每个新行代表这些日期之一。
请参阅下面的两张图片,了解示例输入和所需的输出。
下面的代码片段有效!但是,对于输入表中的每 250 行,运行时间为 1 秒。鉴于我的输入表大小为 120,000,000 行,此代码将需要大约一周的时间才能运行。
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)
Run Code Online (Sandbox Code Playgroud)
必须有一种更快的方法来做到这一点。有任何想法吗?谢谢!
pd.concat在具有大数据集的循环中变得非常慢,因为它每次都会复制帧并返回一个新的数据帧。您正尝试执行此操作 120m 次。我会尝试将这些数据作为简单的元组列表来处理,然后在最后转换为数据帧。
例如
给定一个列表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'])
| 归档时间: |
|
| 查看次数: |
5711 次 |
| 最近记录: |