【发布时间】:2019-11-04 00:33:13
【问题描述】:
我有 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-st。如您所见,我有随机区域(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
最后部分:
我想在12 区域内查看turin_point。
我正在对前 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
试一试:
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
我想要照片中显示的所有行和名称
附言数据集的值发生了变化
【问题讨论】:
标签: python pandas numpy for-loop geopandas