我有像这样的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数组。请帮忙。
答案 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)