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)