У меня есть 2 набора данных border
и df
.
ЧАСТЬ 1:
df =
id_easy ordinal latitude longitude epoch day_of_week
0 e35f652a 68 22.1111 7.2222 1465084811 Sunday
1 e35f652a 69 22.1111 7.2222 1465084870 Sunday
2 e35f652a 70 22.1111 7.2222 1465084930 Sunday
3 e35f652a 71 22.1111 7.2222 1465084990 Sunday
4 e35f652a 72 22.1111 7.2222 1465085050 Sunday
turin = df.loc[df['ordinal'] == 1]
crs = {'init':'epsg:4326'}
geometry = [Point(xy) for xy in zip(turin.longitude,turin.latitude)]
turin_point = gpd.GeoDataFrame(turin,crs=crs,geometry=geometry) #to get geometry
ЧАСТЬ 2:
border.shape
= (931, 674)
первый номер в именах столбцов показывает название зоны. Например, в 12_longitude_1
= зона 12, долгота, 1-й. У меня есть случайные зоны, как вы можете видеть (12, 14, 23 ... и т. Д.)
Вот пример фрейма данных:
border =
12_longitude_1 12_latitude_1 14_longitude_2 14_latitude_2 23_longitude_3 23_latitude_3
11 12 13 14 15 16
11 12 13 14 15 16
11 12 13 14 15 16
ЗАКЛЮЧИТЕЛЬНАЯ ЧАСТЬ:
Я хочу проверить turin_point
в пределах зоны 12
. Я делаю следующую операцию с первыми 2 столбцами:
Код для 12_longitude_1
, 12_latitude_1
:
border = border[['longitude_1','latitude_1']].dropna()
border.longitude_1 = border.longitude_1.replace(r'[()]', '', regex=True)
border.latitude_1 = border.latitude_1.replace(r'[()]', '', regex=True)
border.longitude_1 = pd.to_numeric(border.longitude_1, errors='coerce')
border.latitude_1 = pd.to_numeric(border.latitude_1, errors='coerce')
geometry2 = [Point(xy) for xy in zip(border.longitude_1,border.latitude_1)]
border_point = gpd.GeoDataFrame(border,crs=crs,geometry=geometry2)
turin_final = Polygon([[p.x, p.y] for p in border_point.geometry])
within_turin = turin_point[turin_point.geometry.within(turin_final)]
long_lat_1 = len(within_turin)
Наконец long_lat_12
дает мне 1697
Я хочу автоматизировать этот процесс для всего набора данных (для всех пар столбцов)?
Желаемый результат:
Библиотеки для использования:
import numpy as np
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point, Polygon
TRY:
pd_out = pd.DataFrame({'zone': [], 'number': []})
for col_num in range(0, len(border.columns)-1, 2):
curr_lon_name = border.columns[col_num]
curr_lat_name = border.columns[col_num + 1]
num = curr_lon_name.split("_")[-1]
border = border[[curr_lon_name, curr_lat_name]].dropna()
border[curr_lon_name] = border[curr_lon_name].replace(r'[()]', '', regex=True)
border[curr_lat_name] = border[curr_lat_name].replace(r'[()]', '', regex=True)
border[curr_lon_name] = pd.to_numeric(border[curr_lon_name], errors='coerce')
border[curr_lat_name] = pd.to_numeric(border[curr_lat_name], errors='coerce')
geometry2 = [Point(xy) for xy in zip(border[curr_lon_name],border[curr_lat_name])]
border_point = gpd.GeoDataFrame(border,crs=crs,geometry=geometry2)
turin_final = Polygon([[p.x, p.y] for p in border_point.geometry])
within_turin = turin_point[turin_point.geometry.within(turin_final)]
curr_len = len(within_turin)
pd_out = pd_out.append({'zone': "long_lat_{}".format(num), 'number': curr_len}, ignore_index=True)
Дает мне только 1 строку:
zone number
0 long_lat_1 1697.0
Я хочу все строкии названия как указано на фото
пс значения наборов данных были изменены