说我有以下多边形和点:
>>> 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))
不会给我这一点.
我是否在正确的轨道上?有更简单的方法吗?
假设我有两个共享相同索引的数据帧,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)
有更优雅的方式吗?
谢谢!
假设我有以下字符串的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) 我希望使用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的替代方案.
谢谢您的帮助!
我有一个看起来像这样的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) 假设我有两个不相交的群体/多边形"群岛"(想想两个非相邻县的人口普查区).我的数据看起来像这样:
>>> 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) 我有一个简单的任务,我想知道是否有更好/更有效的方法.我有一个如下所示的数据框:
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)
是否有更好/更清晰的方法将这些值直接添加到数据框?
谢谢您的帮助.
我有一个数据帧,我正在寻找组,然后将组内的值分成多个列.
例如:说我有以下数据帧:
>>> 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) 我有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) 我想在所有可能的组合中将列表拆分为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组,以及组内元素的组合.