Python 如何重复该过程并将结果存储在新的数据帧中

Python 如何重复该过程并将结果存储在新的数据帧中,python,pandas,numpy,for-loop,geopandas,Python,Pandas,Numpy,For Loop,Geopandas,我有两个数据集border和df 第1部分: 第2部分: border.shape=(931674) 列名中的第一个数字显示区域名称。例如,在12_longitude\u 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

我有两个数据集
border
df

第1部分:
第2部分:
border.shape
=
(931674)
列名中的第一个数字显示区域名称。例如,在
12_longitude\u 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
。 我正在对前两列执行以下操作:

12度经度112度纬度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\u lat\u 12
给了我
1697


我想为整个数据集(所有列对)自动化此过程


期望输出:

要使用的库:

import numpy as np
import pandas as pd

import geopandas as gpd
from shapely.geometry import Point, Polygon

尝试: 只给我一行:

    zone         number
0   long_lat_1  1697.0
我想要照片中显示的所有行和名称


p、 数据集的值已更改

您正在覆盖for循环中的边界数据帧。从border dataframe生成一个系列,或者将其覆盖:

pd_out=pd.DataFrame({'zone':[],'number':[]))
对于范围内的列数(0,len(border.columns)-1,2):
curr_lon_name=border.columns[col_num]
curr\u lat\u name=border.columns[col\u num+1]
num=curr_lon_name.split(“”)[0]
zone_border=边界[[curr_lon_name,curr_lat_name]]。dropna()
区域边界[curr\u lon\u name]=区域边界[curr\u lon\u name]。替换(r'[()]','',regex=True)
区域边界[curr\u lat\u name]=区域边界[curr\u lat\u name]。替换(r'[()]','',regex=True)
区域边界[curr\u lon\u name]=pd.to\u numeric(区域边界[curr\u lon\u name],errors='强制')
区域边界[curr\u lat\u name]=pd.to\u numeric(区域边界[curr\u lat\u name],errors='强制')
geometry2=[zip中xy的点(xy)(区域边界[curr\u lon\u name],区域边界[curr\u lat\u name])]
边界点=gpd.GeoDataFrame(区域边界,crs=crs,几何体=geometry2)
都灵最终=多边形([[p.x,p.y]表示边界中的p\u点几何])
在都灵内=都灵点[都灵点.几何学.在(都灵最终)]
curr_len=len(都灵境内)
pd_out=pd_out.append({'zone':“{}.format(num),'number':curr_len},ignore_index=True)

第1期:在列
pd\u out
中,我得到
0
除了1个单元格之外的所有地方。但是我应该得到一个大于
0
@Mamed的数字。看起来都灵大学的决赛是一个多边形,由边界数据框中的区域数字组成。例如:
print(turin_final.wkt)POLYGON((11 12,11 12,11 12,11 12))
这是在创建一个实际上是11,12点的多边形。都灵点不在这种多边形内。请参阅。@Mamed更正:我意识到边框中的值是坐标,而不是区域号。他们仍然需要包含一组坐标以生成有效的多边形,以便检查都灵点是否在这些多边形内。@Mamed我更新了代码以删除我以前的注释,并将
border=border
替换为
zone\u border=border
等。我认为这有助于解决为什么只得到一行。我现在想知道,是否是边界数据是新问题。您有更完整的边界数据帧示例要测试吗?我刚刚重新启动了内核,它可以正常工作。让我再核实一下,我会接受答案的
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)
    zone         number
0   long_lat_1  1697.0