小编AJG*_*519的帖子

在多边形上找到最近点的坐标

说我有以下多边形和点:

>>> poly = Polygon([(0, 0), (2, 8), (14, 10), (6, 1)])
>>> point = Point(12, 4)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我可以计算点到多边形的距离......

>>> dist = point.distance(poly)
>>> print(dist)
2.49136439561
Run Code Online (Sandbox Code Playgroud)

...但我想知道最短距离所测量的多边形边界上的点的坐标.

我最初的方法是通过它与多边形的距离缓冲点,并找到该圆与多边形相切的点:

>>> buff = point.buffer(dist) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 但是,我不确定如何计算这一点.两个多边形不相交,所以list(poly.intersection(buff))不会给我这一点.

我是否在正确的轨道上?有更简单的方法吗?

python shapely

20
推荐指数
2
解决办法
1万
查看次数

按照另一个索引的顺序对Pandas Dataframe进行排序

假设我有两个共享相同索引的数据帧,df1和df2.df1按照我希望df2排序的顺序排序.

df=pd.DataFrame(index=['Arizona','New Mexico', 'Colorado'],columns=['A','B','C'], data=[[1,2,3],[4,5,6],[7,8,9]])
print df

            A  B  C
Arizona     1  2  3
New Mexico  4  5  6
Colorado    7  8  9


df2=pd.DataFrame(index=['Arizona','Colorado', 'New Mexico'], columns=['D'], data=['Orange','Blue','Green'])
print df2
                 D
Arizona     Orange
Colorado      Blue
New Mexico   Green
Run Code Online (Sandbox Code Playgroud)

通过第一个数据框的索引对第二个数据帧进行排序的最佳/最有效方法是什么?

一个选项是加入它们,排序,然后删除列:

df.join(df2)[['D']]

                 D
Arizona     Orange
New Mexico   Green
Colorado      Blue
Run Code Online (Sandbox Code Playgroud)

有更优雅的方式吗?

谢谢!

python pandas

16
推荐指数
1
解决办法
7838
查看次数

两个LineStrings Geopandas的交叉点

假设我有以下字符串的GeoDataFrames,其中一个代表道路,其中一个代表等高线.

>>> import geopandas as gpd
>>> import geopandas.tools
>>> import shapely
>>> from shapely.geometry import *
>>> 
>>> r1=LineString([(-1,2),(3,2.5)])
>>> r2=LineString([(-1,4),(3,0)])
>>> Roads=gpd.GeoDataFrame(['Main St','Spruce St'],geometry=[r1,r2], columns=['Name'])
>>> Roads
        Name                  geometry
0    Main St  LINESTRING (-1 2, 3 2.5)
1  Spruce St    LINESTRING (-1 4, 3 0)
>>> 

>>> c1=LineString(Point(1,2).buffer(.5).exterior)
>>> c2=LineString(Point(1,2).buffer(.75).exterior)
>>> c3=LineString(Point(1,2).buffer(.9).exterior)
>>> Contours=gpd.GeoDataFrame([100,90,80],geometry=[c1,c2,c3], columns=['Elevation'])
>>> Contours
   Elevation                                           geometry
0        100  LINESTRING (1.5 2, 1.497592363336099 1.9509914...
1         90  LINESTRING (1.75 2, 1.746388545004148 1.926487...
2         80  LINESTRING (1.9 2, …
Run Code Online (Sandbox Code Playgroud)

python shapely geopandas

11
推荐指数
1
解决办法
2184
查看次数

使用Geopandas计算与最近特征的距离

我希望使用Geopandas/Shapely 做相当于ArcPy Generate Near Table的工作.我是Geopandas和Shapely的新手,并开发了一种有效的方法,但我想知道是否有更有效的方法.

我有两个点文件数据集 - Census Block Centroids和餐馆.我希望找到每个人口普查区块中心距离它最近的餐厅的距离.对于同一个餐厅而言,对于多个街区来说,最近的餐厅没有任何限制.

这对我来说有点复杂的原因是因为Geopandas距离函数根据索引计算元素,匹配.因此,我的一般方法是将Restaurants文件转换为多点文件,然后将blocks文件的索引设置为全部相同的值.然后,所有块质心和餐馆都具有相同的索引值.

import pandas as pd
import geopandas as gpd
from shapely.geometry import Polygon, Point, MultiPoint
Run Code Online (Sandbox Code Playgroud)

现在阅读Block Centroid和Restaurant Shapefiles:

Blocks=gpd.read_file(BlockShp)
Restaurants=gpd.read_file(RestaurantShp)
Run Code Online (Sandbox Code Playgroud)

由于Geopandas距离函数按元素计算距离,我将Restaurant GeoSeries转换为MultiPoint GeoSeries:

RestMulti=gpd.GeoSeries(Restaurants.unary_union)
RestMulti.crs=Restaurants.crs
RestMulti.reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)

然后我将Blocks的索引设置为等于0(与Restaurants多点相同的值)作为元素计算的解决方法.

Blocks.index=[0]*len(Blocks)
Run Code Online (Sandbox Code Playgroud)

最后,我使用Geopandas距离函数计算每个Block质心到最近餐馆的距离.

Blocks['Distance']=Blocks.distance(RestMulti)
Run Code Online (Sandbox Code Playgroud)

请提供有关如何改进这方面的任何建议.我并不喜欢使用Geopandas或Shapely,但我希望学习ArcPy的替代方案.

谢谢您的帮助!

python pandas shapely geopandas

10
推荐指数
2
解决办法
1万
查看次数

在pandas DataFrame中重新排序MultiIndex的级别

我有一个看起来像这样的DataFrame:

>>> df = pd.DataFrame(index=pd.MultiIndex.from_tuples([(num,letter,color) 
                    for num in range(1,3) 
                    for letter in ['a','b','c'] for color in ['Red','Green']], 
                    names=['Number','Letter','Color']))
>>> df['Value'] = np.random.randint(1,100,len(df))
>>> df
                     Value
Number Letter Color       
1      a      Red       97
              Green     61
       b      Red       97
              Green     98
       c      Red       91
              Green     47
2      a      Red       17
              Green     63
       b      Red       26
              Green     73
       c      Red       34
              Green     68
Run Code Online (Sandbox Code Playgroud)

但我实际上希望我的索引被命令'Letter,Color,Number'.

我目前这样做如下:

>>> df.reset_index().set_index(['Letter','Color','Number'])
                     Value
Letter Color Number       
a      Red   1          97
       Green 1          61
b      Red   1          97
       Green …
Run Code Online (Sandbox Code Playgroud)

python multi-index dataframe pandas

9
推荐指数
1
解决办法
5132
查看次数

在Geopandas/Shapely中识别多边形的唯一分组

假设我有两个不相交的群体/多边形"群岛"(想想两个非相邻县的人口普查区).我的数据看起来像这样:

>>> p1=Polygon([(0,0),(10,0),(10,10),(0,10)])
>>> p2=Polygon([(10,10),(20,10),(20,20),(10,20)])
>>> p3=Polygon([(10,10),(10,20),(0,10)])
>>> 
>>> p4=Polygon([(40,40),(50,40),(50,30),(40,30)])
>>> p5=Polygon([(40,40),(50,40),(50,50),(40,50)])
>>> p6=Polygon([(40,40),(40,50),(30,50)])
>>> 
>>> df=gpd.GeoDataFrame(geometry=[p1,p2,p3,p4,p5,p6])
>>> df
                                        geometry
0        POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))
1  POLYGON ((10 10, 20 10, 20 20, 10 20, 10 10))
2          POLYGON ((10 10, 10 20, 0 10, 10 10))
3  POLYGON ((40 40, 50 40, 50 30, 40 30, 40 40))
4  POLYGON ((40 40, 50 40, 50 50, 40 50, 40 40))
5         POLYGON …
Run Code Online (Sandbox Code Playgroud)

python shapely geopandas

8
推荐指数
1
解决办法
1053
查看次数

将组总计添加到Pandas中的数据框的最佳方法

我有一个简单的任务,我想知道是否有更好/更有效的方法.我有一个如下所示的数据框:

  Group  Score  Count
0     A      5    100
1     A      1     50
2     A      3      5
3     B      1     40
4     B      2     20
5     B      1     60
Run Code Online (Sandbox Code Playgroud)

我想添加一个包含组总计数值的列:

  Group  Score  Count  TotalCount
0     A      5    100         155
1     A      1     50         155
2     A      3      5         155
3     B      1     40         120
4     B      2     20         120
5     B      1     60         120
Run Code Online (Sandbox Code Playgroud)

我这样做的方式是:

Grouped=df.groupby('Group')['Count'].sum().reset_index()
Grouped=Grouped.rename(columns={'Count':'TotalCount'})

df=pd.merge(df, Grouped, on='Group', how='left')
Run Code Online (Sandbox Code Playgroud)

是否有更好/更清晰的方法将这些值直接添加到数据框?

谢谢您的帮助.

python pandas pandas-groupby

7
推荐指数
1
解决办法
3855
查看次数

Pandas groupby结果为多列

我有一个数据帧,我正在寻找组,然后将组内的值分成多个列.

例如:说我有以下数据帧:

>>> import pandas as pd
>>> import numpy as np
>>> df=pd.DataFrame()
>>> df['Group']=['A','C','B','A','C','C']
>>> df['ID']=[1,2,3,4,5,6]
>>> df['Value']=np.random.randint(1,100,6)
>>> df
  Group  ID  Value
0     A   1     66
1     C   2      2
2     B   3     98
3     A   4     90
4     C   5     85
5     C   6     38
>>> 
Run Code Online (Sandbox Code Playgroud)

我想通过"组"字段进行分组,获取"值"字段的总和,并获取新字段,每个字段都包含组的ID值.

目前我能够做到如下,但我正在寻找一种更清洁的方法:

首先,我创建一个数据框,其中包含每个组中的ID列表.

>>> g=df.groupby('Group')
>>> result=g.agg({'Value':np.sum, 'ID':lambda x:x.tolist()})
>>> result
              ID  Value
Group                  
A         [1, 4]     98
B            [3]     76
C      [2, 5, 6]    204
>>> 
Run Code Online (Sandbox Code Playgroud)

然后我使用pd.Series将它们分成列,重命名,然后再加入.

>>> id_df=result.ID.apply(lambda …
Run Code Online (Sandbox Code Playgroud)

python pandas

7
推荐指数
1
解决办法
4954
查看次数

在共享索引上加入Pandas Dataframes

我有3个DataFrames具有不同数量的共享索引.例如:

>>> df0=pd.DataFrame(index=pd.MultiIndex.from_product([[1,2,3,4],[2011,2012],['A','B']], names=['Season','Year','Location']))
>>> df0['Value0']=np.random.randint(1,100,len(df0))
>>> 
>>> df1=pd.DataFrame(index=pd.MultiIndex.from_product([[2011,2012],['A','B']], names=['Year','Location']))
>>> df1['Value1']=np.random.randint(1,100,len(df1))
>>> 
>>> df2=pd.DataFrame(index=['A','B'])
>>> df2.index.name='Location'
>>> df2['Value2']=np.random.randint(1,100,len(df2))
>>> df0
                      Value0
Season Year Location        
1      2011 A             18
            B             63
       2012 A             88
            B             30
2      2011 A             35
            B             60
       2012 A             61
            B              4
3      2011 A             70
            B              9
       2012 A             11
            B             38
4      2011 A             68
            B             57
       2012 A             13
            B             35
>>> df1
               Value1
Year Location        
2011 A             22
     B …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas

6
推荐指数
1
解决办法
3320
查看次数

如何在组长度和组内元素的所有可能组合中将列表拆分为n个组?

我想在所有可能的组合中将列表拆分为n组(允许变量组长度).

说,我有以下列表:

lst=[1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

如果我指定n = 2,则可以将列表分成1个元素-3元素或2个元素-2元素的组.在这两种分割列表的方式中,每个列表中都有各种元素的唯一组合.

当n = 2时,这些将是:

(1),(2,3,4)
(2),(1,3,4)
(3),(1,2,4)
(4),(1,2,3)
(1,2),(3,4)
(1,3),(2,4)
(1,4),(2,3)
Run Code Online (Sandbox Code Playgroud)

当n = 1时,这些将是:

(1,2,3,4)
Run Code Online (Sandbox Code Playgroud)

n = 3时,这些将是:

(1),(2),(3,4)
(1),(3),(2,4)
(1),(4),(2,3)
(2),(3),(1,4)
(2),(4),(1,3)
(3),(4),(1,2)
Run Code Online (Sandbox Code Playgroud)

我对长度为0的组不感兴趣,并且组内的顺序无关紧要.

我发现了两个类似的问题,但他们并没有完全回答我的问题.

这个问题将列表分成所有组合,其中每个组的长度为n(我发现@tokland的答案)特别有用).但是,我并不是要寻找所有组长度相同的组.

然后,问题的第一步获得拆分位置的独特组合,以将列表拆分为n个组.但是,此处保留了列表顺序,并且未确定这些组中元素的唯一组合.

我正在寻找这两个问题的组合 - 列表在组长度的所有可能组合中分成n组,以及组内元素的组合.

python

6
推荐指数
2
解决办法
4821
查看次数