【问题标题】:How to repeate the process and store result in the new data frame pandas如何重复该过程并将结果存储在新的数据框 pandas 中
【发布时间】:2019-11-04 00:33:13
【问题描述】:

我有 2 个数据集 borderdf

第 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


    【解决方案1】:

    您正在覆盖 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)
    

    【讨论】:

    • 问题 1:在 pd_out 列中,除了 1 个单元格外,我在任何地方都得到 0。但我应该得到比0更多的数字
    • @Mamed 看起来 turin_final 是一个由 border 数据框中的区域编号组成的多边形。例如:print(turin_final.wkt) POLYGON ((11 12, 11 12, 11 12, 11 12)) 这是创建一个多边形,它实际上是 11,12 处的一个点。 turin_point 不会在那种多边形内。见GeoSeries.within(self, other)
    • @Mamed 更正:我意识到 border 中的值是坐标,而不是区域编号。他们仍然需要包含一组坐标来制作有效的多边形,以检查 turin_point 是否在这些多边形内。
    • @Mamed 我更新了代码以删除我之前制作的 cmets,并将 border = border 替换为 zone_border = border 等。我认为这有助于解决为什么你只得到 1 行。我现在想知道是否是 border 中的数据是新问题。你有更完整的边框数据框示例来测试吗?
    • 我刚刚重新启动了内核,它可以工作了。让我仔细检查一下,我会接受答案
    猜你喜欢
    • 2015-03-17
    • 2021-07-03
    • 2020-01-02
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2022-01-16
    • 2011-06-03
    相关资源
    最近更新 更多