Объединение огромного dataFrame в диапазоне значений - PullRequest
2 голосов
/ 06 мая 2020

У меня есть два фрейма данных со значениями lat-lon и некоторая дополнительная информация. Я хочу объединить два фрейма данных в диапазоне значений

df1 

lat1 lon1 lat2 lon2 a1 a2 a2
1.0   1.0  4.0  7.0 a  d  p
2.0   2.0  5.0  8.0 b  e  q
3.0   3.0  6.0  9.0 c  f  r

Размер 30 миллионов строк

df2

lat  lon  x 
1.0  1.0  m
1.0  2.0  n
2.0  3.0  o

Это 20 миллионов строк

Теперь для каждой строки в df1 я хочу объединиться с df2, имеющим все широты в df2 между lat1 и lat2 и lon в lon1 и lon2

lat1<=lat<=lat2
lon1<=lon<=lon2

Я пробовал
Лучший способ присоединиться / слиться по диапазону в pandas
как выполнить внутреннее или внешнее соединение DataFrames с Pandas на не- simpleisti c критерий

Но все же у меня заканчивается память.
Как это сделать наиболее оптимальным образом?

1 Ответ

0 голосов
/ 06 мая 2020
import geopandas as gp
from shapely.geometry import Polygon, Point
df2_geo = gp.GeoDataFrame(df2, geometry=gp.points_from_xy(df2.latitude, df2.longitude))

def make_polygon(a,b,c,d):
    lat_list = [a,a,c,c]
    lon_list = [b,d,d,b]
    return Polygon(zip(lat_list, lon_list))

df1['geometry'] = df1.apply(lambda x: make_polygon(x['_from_latitude'], x['_from_longitude'], x['_to_latitude'],x['_to_longitude']),axis=1)              
df1_gep = gp.GeoDataFrame(df1)
result = geopandas.sjoin(df2_geo, df1_gep, how="inner", op='intersects')

@ SubbuVidyaSekar Спасибо за предложение
Это отлично работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...