如何用lis对数据帧进行子集划分

2024-06-07 07:07:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的熊猫数据帧。你知道吗

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

但它给了我一个列表,列出了数据库中所有的lat和long。在这里,我无法区分哪些lat和long属于哪些DB元素。因此,对于每个DB元素(在我的例子中是6个),我需要6个lat和long数组。请帮忙。你知道吗


Tags: 数据id元素列表dbdataorder子集
2条回答

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

首先,我要将您的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]]

相关问题 更多 >