如何用列表对pandas数据框进行子集化

时间:2016-01-20 17:47:05

标签: python pandas

我有像这样的pandas数据框。

     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  ]])

(只是一个例子,不是正确的lat长对)。

我正在做以下事情:

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中所有lat和long的列表。在这里,我无法区分哪个lat和long属于哪个DB元素。因此,对于每个DB元素(在我的情况下为6),我想要6个lat和long数组。请帮忙。

2 个答案:

答案 0 :(得分: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]]

答案 1 :(得分: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)
相关问题