2016-08-31 74 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