2017-09-15 84 views
0

擴大MULTIPOLYGON我有一個包含兩個多邊形和multipolygons如下shape文件:在geopanda數據幀

name           geometry 
0 AB10 POLYGON ((-2.116454759005259 57.14656265903432... 
1 AB11 (POLYGON ((-2.052573095588467 57.1342600856536... 
2 AB12 (POLYGON ((-2.128066321470298 57.0368357386797... 
3 AB13 POLYGON ((-2.261525922489881 57.10693578217748... 
4 AB14 POLYGON ((-2.261525922489879 57.10693578217748... 

的第二和第三排對應組合區,而其餘的都是多邊形。 我想將幾何圖形爲Multipolygon類型的行擴展爲Polygon行,如下所示。

name           geometry 
0 AB10 POLYGON ((-2.116454759005259 57.14656265903432... 
1 AB11 POLYGON ((-2.052573095588467 57.1342600856536... 
2 AB11 POLYGON ((-2.045849648028651 57.13076387483844... 
3 AB12 POLYGON ((-2.128066321470298 57.0368357386797... 
4 AB12 POLYGON ((-2.096125852304303 57.14808092585477 
3 AB13 POLYGON ((-2.261525922489881 57.10693578217748... 
4 AB14 POLYGON ((-2.261525922489879 57.10693578217748... 

請注意,AB11和AB12 Multipolygon已擴展爲多行,其中每行對應一個多邊形數據。

我認爲這是geopanda數據處理。有沒有一種pythonic的方式來實現上述?

謝謝!

+0

這不會是沒有非常有幫助一些上下文或一些代碼來重現實際的數據幀。 –

回答

0

我目前的解決方案是雙倍的。

第1步。遍歷每一行,如果類型是多面體,則應用列表理解。

name           geometry 
0 AB10 POLYGON ((-2.116454759005259 57.14656265903432... 
1 AB11 [POLYGON ((-2.052573095588467 57.1342600856536... 
2 AB12 [POLYGON ((-2.128066321470298 57.0368357386797... 
3 AB13 POLYGON ((-2.261525922489881 57.10693578217748... 
4 AB14 POLYGON ((-2.261525922489879 57.10693578217748... 

第2步:使用將一行中元素列表擴展到多行的技巧。

df.set_index(['name'])['geometry'].apply(pd.Series).stack().reset_index() 

    name level_1             0 
0 AB10  0 POLYGON ((-2.116454759005259 57.14656265903432... 
1 AB11  0 POLYGON ((-2.052573095588467 57.13426008565365... 
2 AB11  1 POLYGON ((-2.045849648028651 57.13076387483844... 
3 AB12  0 POLYGON ((-2.128066321470298 57.0368357386797,... 
4 AB12  1 POLYGON ((-2.096125852304303 57.14808092585477... 
5 AB13  0 POLYGON ((-2.261525922489881 57.10693578217748... 
6 AB14  0 POLYGON ((-2.261525922489879 57.10693578217748... 

請讓我知道是否有辦法做到這一步!

0

如果您只有兩列,我們可以使用numpy來提高速度。

如果你有一個像

 
    name    geometry 
0  0    polygn(x) 
1  2 (polygn(x), polygn(x)) 
2  3    polygn(x) 
3  4 (polygn(x), polygn(x)) 

一個數據幀然後numpy的meshgrid將有助於

def cartesian(x): 
    return np.vstack(np.array([np.array(np.meshgrid(*i)).T.reshape(-1,2) for i in x.values])) 

ndf = pd.DataFrame(cartesian(df),columns=df.columns) 

輸出:

 
    name geometry 
0 0 polygn(x) 
1 2 polygn(x) 
2 2 polygn(x) 
3 3 polygn(x) 
4 4 polygn(x) 
5 4 polygn(x) 
%%timeit 
ndf = pd.DataFrame(cartesian(df),columns=df.columns) 

1000 loops, best of 3: 679 µs per loop 

%%timeit 
df.set_index(['name'])['geometry'].apply(pd.Series).stack().reset_index() 

100 loops, best of 3: 5.44 ms per loop