【问题标题】:how to subset pandas dataframe with list如何使用列表对熊猫数据框进行子集化
【发布时间】:2016-04-26 17:02:39
【问题描述】:

我有一个这样的熊猫数据框。

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

(只是一个例子,不是正确的经纬度对)。

我正在做以下事情:

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 属于哪个 DB 元素。因此,对于每个 DB 元素(在我的情况下为 6 个),我想要 6 个纬度和经度数组。请帮忙。

【问题讨论】:

    标签: python pandas


    【解决方案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]]
    

    【讨论】:

      【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-16
        • 1970-01-01
        相关资源
        最近更新 更多