Как повторить процесс и сохранить результат в новом кадре данных панд - PullRequest
1 голос
/ 04 ноября 2019

У меня есть 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


Я хочу автоматизировать этот процесс для всего набора данных (для всех пар столбцов)?


Желаемый результат:

enter image description here

Библиотеки для использования:

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

Я хочу все строкии названия как указано на фото

пс значения наборов данных были изменены

1 Ответ

1 голос
/ 06 ноября 2019

Вы перезаписываете фрейм данных границы в цикле for. Вместо этого создайте серию из граничного фрейма данных или перезапишите его:

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("_")[0]
    zone_border = border[[curr_lon_name, curr_lat_name]].dropna()
    zone_border[curr_lon_name] = zone_border[curr_lon_name].replace(r'[()]', '', regex=True)
    zone_border[curr_lat_name] = zone_border[curr_lat_name].replace(r'[()]', '', regex=True)
    zone_border[curr_lon_name] = pd.to_numeric(zone_border[curr_lon_name], errors='coerce')
    zone_border[curr_lat_name] = pd.to_numeric(zone_border[curr_lat_name], errors='coerce')
    geometry2 = [Point(xy) for xy in zip(zone_border[curr_lon_name],zone_border[curr_lat_name])]
    border_point = gpd.GeoDataFrame(zone_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': "{}".format(num), 'number': curr_len}, ignore_index=True)
...