2016-08-31 46 views
4

我有一堆地理数据如下。 我想将这些数据按照经度0.2度和纬度0.2度的分组进行分组。熊猫 - 组/数据每经度/纬度

虽然对于经纬度来说都是微不足道的,但对于这两个变量来说这样做最合适吗?

|User_ID |Latitude |Longitude|Datetime   |u |v | 
|---------|----------|---------|-------------------|-----|-----| 
|222583401|41.4020375|2.1478710|2014-07-06 20:49:20|0.3 | 0.2 | 
|287280509|41.3671346|2.0793115|2013-01-30 09:25:47|0.2 | 0.7 | 
|329757763|41.5453577|2.1175164|2012-09-25 08:40:59|0.5 | 0.8 | 
|189757330|41.5844998|2.5621569|2013-10-01 11:55:20|0.4 | 0.4 | 
|624921653|41.5931846|2.3030671|2013-07-09 20:12:20|1.2 | 1.4 | 
|414673119|41.5550136|2.0965829|2014-02-24 20:15:30|2.3 | 0.6 | 
|414673119|41.5550136|2.0975829|2014-02-24 20:16:30|4.3 | 0.7 | 
|414673119|41.5550136|2.0985829|2014-02-24 20:17:30|0.6 | 0.9 | 

到目前为止,我所做的是创建2个线性空间:

groups = df.groupby(pd.cut(df.Longitude, lonbins)) 

然后我可以明显地遍历组创建:

lonbins = np.linspace(df.Longitude.min(), df.Longitude.max(), 10) 
latbins = np.linspace(df.Latitude.min(), df.Latitude.max(), 10) 

然后我就可以使用GROUPBY第二级。我的目标是对每个组进行统计分析,并可能将它们显示在地图上,这看起来不太方便。

bucket = {} 
for name, group in groups: 
    print name bucket[name] = group.groupby(pd.cut(group.Latitude, latbins)) 

例如,我愿做这将显示每个latlon中,在每个latlon箱速度的分布显示,行数热图...

+2

为什么不做一个,然后其他? – benten

+1

你到目前为止尝试过什么?请发布您的代码。 – James

+0

您样本数据框的预期结果是什么?如果你会发布它,我们可以更好地理解你的问题。谢谢! – ragesz

回答

4

这个怎么样?

step = 0.2 
to_bin = lambda x: np.floor(x/step) * step 
df["latbin"] = df.Latitude.map(to_bin) 
df["lonbin"] = df.Longitude.map(to_bin) 
groups = df.groupby(("latbin", "lonbin")) 
+0

谢谢,这是一个很好的解决方案。如果我想更轻松地将统计数据转换回可能会添加到底图的图层(我不确定这是否可能),可能我应该将您的解决方案与linspace混合。例如: to_lonbin = lambda x:lonbin.searchsorted(x) 你瘦了什么? – tog

+0

这应该工作,但在这里似乎并不需要搜索。 to_lonbin = lambda x:np.floor((x + 180)/ step)应该产生相同的结果。 –

+0

说我必须将数据分组而不是一个简单的规则0.2格,但给定的网格(我有lat_bin_edges和lon_bin_edges值,但它不是正常的)。我如何修改这个? – claire