我有一个 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)
必须有一种更快的方法来做到这一点。有任何想法吗?谢谢!
我有df从 A -> B/C 出发的航班时间以及从 B/C -> Z 出发的航班。
我想找到 A->Z 之间可能的一站式路线。这些需要在 B/C 停留。
一个简单的合并就可以了。
routes = pd.merge(df , df , left_on = 'Destination' , right_on = 'Origin')
Run Code Online (Sandbox Code Playgroud)
但是,我的时间表 df 有数千个从 A -> B/C/D/.../Y 出发的航班,以及数千个从 B/C/D/.../Y->Z 出发的航班。将此表与其自身合并会产生一个routes长达数十亿行的表。我可以通过筛选停留时间<24 小时的路由来筛选出较小的 df。
routes = routes[routes['Time_y'] - routes['Time_x'] < 24]
Run Code Online (Sandbox Code Playgroud)
首先计算所有可能的路线,然后筛选出中转时间小于 24 小时的路线,这在计算上是不可行的。有什么办法可以pd.merge在中转时间<24小时的情况下同时进行吗?伪代码是:
routes = pd.merge(df , df , left_on = 'Destination' , right_on = 'Origin' , right['Time'] - left['Time'] < 24)
Run Code Online (Sandbox Code Playgroud)
这是示例数据:
df = pd.DataFrame({'Origin': {1: 'A', …Run Code Online (Sandbox Code Playgroud) 我在 Oracle 数据库上运行以下查询:
EXPLAIN PLAN FOR
SELECT *
FROM table_name
Run Code Online (Sandbox Code Playgroud)
但是,它没有返回任何数据。当我删除该EXPLAIN PLAN FOR子句时,查询确实按预期运行。谢谢您的帮助!
如果相关的话,我将通过 Teradata 和 Jupyter IPython 笔记本访问数据库。