2016-01-20 66 views
2

我有一個像這樣的熊貓數據框。如何將熊貓數據框與列表子集

 order_id latitude longitude 
0  519  19.119677 72.905081 
1  520  19.138250 72.913190 
2  521  19.138245 72.913183 
3  523  19.117662 72.905484 
4  524  19.137793 72.913088 
5  525  19.119372 72.893768 
6  526  19.116275 72.892951 
7  527  19.133430 72.913268 
8  528  19.136800 72.917185 
9  529  19.118284 72.901114 
10  530  19.127193 72.914269 
11  531  19.114269 72.904039 
12  532  19.136292 72.913941 
13  533  19.119075 72.895115 
14  534  19.119677 72.905081 
15  535  19.119677 72.905081 

另外一個清單

DB 
Out[658]: 
[['523'], 
['526', '533'], 
['527', '528', '532', '535'], 
['530', '519'], 
['529', '531', '525', '534'], 
['520', '521', '524']] 

現在我想子集上的列表元素數據幀。列表中有6個元素,每個元素都有一個order_id的子列表。所以,對於每個子元素,我都需要相應的經度和緯度。然後,我要計算每個order_id location之間的半正矢距離:

DB[2] 
['527', '528', '532', '535'] 

然後我想在子集爲緯度和經度對主數據幀。所以它應該返回給我一個像這樣的數組:

array([[ 19.11824057, 72.8939447 ], 
    [ 19.1355074 , 72.9147978 ], 
    [ 19.11917348, 72.90518167], 
    [ 19.127193 , 72.914269 ]]) 

(只是一個例子不是一個正確的拉長對)。

我做如下:

db_lat = [] 
db_long = [] 
for i in range(len(DB)): 
    l = len(DB[i]) 
    for j in range(l): 
     db_lat.append(tsp_data_unique.latitude[tsp_data_unique['order_id'] == 
     ''.join(DB[i][j])]) 
     db_long.append(tsp_data_unique.longitude[tsp_data_unique['order_id'] 
     == ''.join(DB[i][j])]) 

但它給我的緯度和長期存在的所有在DB的列表。在這裏,我無法區分哪些經緯度屬於哪個數據庫元素。所以,對於每個數據庫元素(在我的情況下是6)我需要6個lat和long數組。請幫忙。

回答

1

首先,我將你的int列轉換爲str比較與列表的數值數據框:

df['order_id'] = df['order_id'].apply(str) 

,然後設置上order_id指數:

df = df.set_index('order_id') 

然後你可以這樣做:

pairs = df.loc[DB[2]].values 

獲得:

array([[ 19.13343 , 72.913268], 
     [ 19.1368 , 72.917185], 
     [ 19.136292, 72.913941], 
     [ 19.119677, 72.905081]]) 

編輯: 遍歷列表則可以:

In [93]: for i in range(len(DB)): 
    ....:  p = df.loc[DB[i]].values 
    ....:  print p 
    ....:  
[[ 19.117662 72.905484]] 
[[ 19.116275 72.892951] 
[ 19.119075 72.895115]] 
[[ 19.13343 72.913268] 
[ 19.1368 72.917185] 
[ 19.136292 72.913941] 
[ 19.119677 72.905081]] 
[[ 19.127193 72.914269] 
[ 19.119677 72.905081]] 
[[ 19.118284 72.901114] 
[ 19.114269 72.904039] 
[ 19.119372 72.893768] 
[ 19.119677 72.905081]] 
[[ 19.13825 72.91319 ] 
[ 19.138245 72.913183] 
[ 19.137793 72.913088]] 
0

這是我如何解決它。類似於@Fabio發佈的內容。

new_DB=[] 
for i in range(len(DB)): 
    new_DB.append(tsp_data_unique[(tsp_data_unique['order_id']).isin(DB[i])] 
    [['latitude','longitude']].values)