熊猫合并<运算符

时间:2019-02-13 20:10:00

标签: python pandas

我有一个if 'search' in request.GET: search_term = request.GET['search'] search_result = Article.objects.all().filter(feeder__icontains=search_term) articles = Article.objects.all() return render(request, 'overviews/overview.html', {'articles' : articles, 'search_result': search_result }) ,航班的飞行时间为A-> B / C,航班为B / C-> Z。

schedule

我想找到A-> Z之间的一站式路线。这些将需要在B / C停留。

一个简单的合并就可以了。

df

Routes

但是,我的日程安排d拥有从A-> B / C / D /.../ Y出发的数千个航班,以及从B / C / D /.../ Y-> Z出发的数千个航班。将此表与其自身合并,将生成一个routes = pd.merge(df , df , left_on = 'Destination' , right_on = 'Origin') 表,该表长数十亿行。我可以通过过滤小于24小时的停留时间的路由来过滤到小的df。

routes

在计算上不可能首先计算所有可能的路由,然后过滤到停留时间少于24小时的路由。是否有任何方法可以在停留时间少于24小时的情况下同时执行routes = routes[routes['Time_y'] - routes['Time_x'] < 24] ?伪代码为:

pd.merge

以下是示例数据:

routes = pd.merge(df , df , left_on = 'Destination' , right_on = 'Origin' , right['Time'] - left['Time'] < 24)

1 个答案:

答案 0 :(得分:0)

考虑计算未来(提前1天)的日期,并将其添加到与Origin / Destination的合并中:

from datetime import timedelta
...

df['Future_Time'] = df['Flight_Time'] + timedelta(days=1)

merged_df = pd.merge(df, df, 
                     left_on = ['Destination', 'Future_Time'],
                     right_on = ['Origin', 'Flight_Time'],
                     suffixes=['_o','_d'])

假设您的飞行时间中有影响合并联接的时间分量,请将日期归一化到计算出的未来日期之前的最后一个午夜并进行合并:

df['Normalized_Time'] = df['Flight_Time'].dt.normalize()
df['Future_Time'] = df['Normalized_Time'] + timedelta(days=1)

merged_df = pd.merge(df, df, 
                     left_on = ['Destination', 'Future_Time'],
                     right_on = ['Origin', 'Normalized_Time'],
                     suffixes=['_o','_d'])

以上可能会导致24-48小时配对问题。但是从那里您可以根据24小时范围对较小的集合进行过滤:

merged_df[merge_df['Flight_Time_d'] <= merge_df['Flight_Time_o'] + timedelta(days=1)]

或全部在一起:

merged_df = (pd.merge(df, df, 
                      left_on = ['Destination', 'Future_Time'],
                      right_on = ['Origin', 'Normalized_Time'],
                      suffixes=['_o','_d'])
               .query("Flight_Time_d <= Flight_Time_o + timedelta(days=1)")
            )