Python 如何使用列表对数据帧进行子集

Python 如何使用列表对数据帧进行子集,python,pandas,Python,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.119

我有一个像这样的数据框

     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']]
现在,我想在列表元素上子集dataframe。列表中有6个元素,每个元素都有一个子列表
order\u id
。所以,对于每个子元素,我需要相应的纬度和经度。然后我想计算每个
订单id位置之间的哈弗斯线距离

 DB[2]
 ['527', '528', '532', '535']
然后我想在主数据帧上为纬度和经度对创建子集。因此,它应该返回如下数组:

array([[ 19.11824057,  72.8939447 ],
   [ 19.1355074 ,  72.9147978 ],
   [ 19.11917348,  72.90518167],
   [ 19.127193  ,  72.914269  ]])
(只是一个示例,不是正确的lat-long对)

我正在做以下工作:

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数组。请帮助。

首先,我会将您的
int
列转换为
str
,以将数据帧与列表的值进行比较:

df['order_id'] = df['order_id'].apply(str)
然后在
订单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]]

我就是这样解决的。与@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)