小编Cry*_*tie的帖子

增强 geopandas 叠加(交叉)的性能

我有两组带有多边形的 shapefile。一组 shapefile 只是我感兴趣的美国县,这因公司和年份而异。另一组 shapefile 是公司的业务领域,当然这因公司和年份而异。我需要每年为每个公司获得这两层的交集。到目前为止,函数 overlay(df1, df2, how = 'intersection') 实现了我的目标。但每个公司年需要大约 300 秒。鉴于我有很长的公司名单和很多年,这需要我几天才能完成。有什么办法可以提高这种性能吗?

我注意到,如果我在 ArcGIS 中做同样的事情,300 秒就会缩短到几秒钟。但是我是ArcGIS的新用户,还不熟悉里面的python。

python intersection arcgis polygons geopandas

7
推荐指数
2
解决办法
2355
查看次数

Pandas 数据框按日期移动列

我有一个按日期和 ID 索引的面板数据集,如下所示:

df = pd.DataFrame({'Date':['2005-12-31', '2006-03-31', '2006-09-30','2005-12-31', '2006-03-31', '2006-06-30', '2006-09-30'],
              'ID':[1,1,1,2,2,2,2],
              'Value':[14,25,34,23,67,14,46]})
Run Code Online (Sandbox Code Playgroud)

我试图按日期移动相同 ID 的值,并且日期可以是不连续的季度。groupby.shift 没有给我正确的东西,或者也许我错过了一些东西。这是我所做的:

df['pre_value'] = df.groupby('ID')['Value'].shift(1)
Run Code Online (Sandbox Code Playgroud)

这确实会移动相同 ID 的值,但它会忽略日期...请注意,对于ID==12006-06-30缺少 ,因此pre_value2006-09-30实际上应该是 NaN 。我还在研究多重索引或将数据集声明为面板,但这使我的其他计算变得复杂。有没有简单的方法可以使用数据框来做到这一点?

python dataframe pandas

5
推荐指数
1
解决办法
3768
查看次数

Geopandas 覆盖交叉点

我试图找到两组多边形的交集,其中一组是从人口普查数据产品(poly1)中选择的一些人口普查区域,另一组由我自己定义的多边形(poly2)。我很想知道哪些人口普查区属于我的每个多边形(交点),然后从那里计算相交的人口普查区的面积等等。

我使用了以下代码:

import geopandas as gp
gp.overlay(censustracts, mypolygons, how = 'intersection')
Run Code Online (Sandbox Code Playgroud)

这适用于不涉及太多人口普查区域的情​​况。我精心挑选了一些案例(5000~40,000 个人口普查区)并在 ArcMap 中进行了交集计算并交叉检查了结果。似乎 geopandas.overlay 给出的结果不太准确:有时不应该将给定的“相交”人口普查区算作相交;有时应该交叉的人口普查区域会丢失。

此外,如果我只从我的自定义多边形 (poly2) 中选择一个多边形并选择它应该与之相交的正确人口普查区域,则 geopandas.overlay 可以正常工作。

我不知道为什么会这样。似乎只讨论了 geopandas 覆盖的速度(https://github.com/geopandas/geopandas/issues/400),但我没有发现任何关于准确性的信息。我错过了什么吗?

python intersection geopandas

5
推荐指数
0
解决办法
625
查看次数

Pandas pivot_table 百分位

我试图通过平均值、中位数、第 25 个百分位数、第 75 个百分位数、标准差来描述 A、B 列。

df = pd.DataFrame({'A':[1,9,3,4,6,8,2,7],
                   'B':[2,4,7,8,9,2,5,6],
                   'S':['L','L','L','S','L','S','S','L']})
Run Code Online (Sandbox Code Playgroud)

这是我所做的并且它有效,因为我只有 25%:

df.pivot_table(columns = ['S'], values = ['A','B'], aggfunc = [np.mean, lambda x: np.percentile(x,25), np.median, np.std])
Run Code Online (Sandbox Code Playgroud)

但是,如果我还输入了第 75 个百分位数,则会显示错误消息:

Reindexing only valid with uniquely valued Index objects
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望输出列出下一列中的第 75 个百分位数。

python pivot-table

4
推荐指数
1
解决办法
4183
查看次数

Pandas DataFrame 按日期移动列以创建滞后值

我有一个数据框:

df = pd.DataFrame({'year':[2000,2000,2000,2001,2001,2002,2002,2002],'ID':['a','b','c','a','b','a','b','c'],'values':[1,2,3,4,5,7,8,9]})
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想创建一个列,其中包含每个 ID 年的滞后值,例如,2000 年的 ID'a' 的值为 1,因此 2001 年的 ID'a' 的预值为 1。关键点是,如果一个 ID 在前一年没有值(因此某些 ID 的年份不连续),则预值应该为 NaN,而不是两年前的值。例如,ID'c' 在 2001 年没有出现,那么对于 2002 年,ID'c' 的预值应该 = NaN。理想情况下,最终输出应如下所示: 在此输入图像描述

我尝试了 df.groupby(['ID'])['values'].shift(1),但它给出了以下内容: 在此输入图像描述

问题是,当 ID'c' 没有一年前的值时,将使用两年前的值。我还尝试了多索引移位,这给了我相同的结果。

df.set_index(['year','ID'], inplace = True)
df.groupby(level=1)['values'].shift(1)
Run Code Online (Sandbox Code Playgroud)

有效的就是这里提到的答案。但由于我的数据帧相当大,合并会杀死内核。到目前为止,我还没有找到更好的方法。我希望我清楚地解释了我的问题。

python dataframe pandas panel-data

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

熊猫情节条形图在线

我正在尝试在同一个图表上绘制一个条形和一条线.这是有效的,有效的是什么.请问有谁解释原因?

什么不起作用:

df = pd.DataFrame({'year':[2001,2002,2003,2004,2005], 'value':[100,200,300,400,500]})
df['value1']= df['value']*0.4
df['value2'] = df['value']*0.6
fig, ax = plt.subplots(figsize = (15,8))
df.plot(x = ['year'], y = ['value'], kind = 'line', ax = ax)
df.plot(x = ['year'], y= ['value1','value2'], kind = 'bar', ax = ax)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但不知何故,当我x=['year']在第一个图中删除它时它会起作用:

fig, ax = plt.subplots(figsize = (15,8))
df.plot(y = ['value'], kind = 'line', ax = ax)
df.plot(x = ['year'], y= ['value1','value2'], kind = 'bar', ax = ax)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

python matplotlib pandas

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