【问题标题】:decode polyline from dataframe从数据帧解码折线
【发布时间】:2021-03-23 03:11:15
【问题描述】:

我有一个包含十列的数据框: 编号 |用户 ID |折线 | ...

列“折线”由加密路线组成,可以翻译成简单的纬度/经度列表。安装折线(例如通过 pip install)将允许使用以下代码来获得所需的纬度/经度。

import polyline
polyline.decode('onl~Fj|cvOrsEg}@rHuvK')

结果: [(41.84824, -87.67958), (41.81422, -87.66962), (41.81268, -87.60439)]

我正在尝试从折线列解码折线并将其最后一个元素(在上面的示例中 - (41.81268, -87.60439) 写入单独的列。

我正在尝试在Writing to a dataframe through a loop 中找到的解决方案,但它对我不起作用。你能帮我得到想要的结果吗?

【问题讨论】:

  • 你能分享几行这条折线的样子吗?
  • 抱歉我不够精确。我编辑了问题

标签: python pandas polyline


【解决方案1】:

根据您的帖子,我相信polyline 字段是字符串类型的列。因此,您可以使用以下步骤作为基础来获取您需要的数据。

创建数据框

>>> import pandas as pd

>>> df = pd.DataFrame({"A": ["my first sentence", "it is a test", "split is fun"]})

>>> df
                   A
0  my first sentence
1       it is a test
2       split is fun

将该列拆分为一个新列

>>> df["new_column"] = df["A"].str.split()

>>> df
                   A             new_column
0  my first sentence  [my, first, sentence]
1       it is a test      [it, is, a, test]
2       split is fun       [split, is, fun]

使用列表的最后一个元素创建一个新列

>>> df["last_element"] = df["new_column"].str[-1]

>>> df
                   A             new_column last_element
0  my first sentence  [my, first, sentence]     sentence
1       it is a test      [it, is, a, test]         test
2       split is fun       [split, is, fun]          fun

你也可以一步完成,如下

>>> df["last_element"] = df["A"].str.split().str[-1]

【讨论】:

  • 谢谢保罗。当我解密折线并且我需要将纬度与经度分开时,上述步骤将很有帮助。我的问题不够精确,所以我在上面提供了更多详细信息。
【解决方案2】:

您可以先使用map 对每一行应用一个函数,然后您可以选择其输出的第三个元素来获取纬度/经度。最后,您可以通过选择值01 将此输出分别拆分为纬度和经度。假设您的数据框包含名为“折线”的列中的折线:

import polyline
polyline.decode('onl~Fj|cvOrsEg}@rHuvK')

df['lat/long'] = df['polyline'].map(lambda x: polyline.decode(x)[2])
df['lat'] = df['lat/long'].str[0]
df['long'] = df['lat/long'].str[1]

您也可以删除 lat/long 列,因为您拥有单独的值:

df = df.drop(columns='lat/long')

逐步演练,创建示例数据框并应用polyline.decode(x) 以获得所需的lat/long 值:

df = pd.DataFrame({'Col1':['A','B','C'],'Polyline':['onl~Fj|cvOrsEg}@rHuvK','onl~Fj|cvOrsEg}@rHuvK','onl~Fj|cvOrsEg}@rHuvK']})
df['lat/long'] = df['Polyline'].map(lambda x: polyline.decode(x)[2])

输出:

  Col1               Polyline               lat/long
0    A  onl~Fj|cvOrsEg}@rHuvK  (41.81268, -87.60439)
1    B  onl~Fj|cvOrsEg}@rHuvK  (41.81268, -87.60439)
2    C  onl~Fj|cvOrsEg}@rHuvK  (41.81268, -87.60439)

使用来自lat/long 的值创建latlong 列:

df['lat'] = df['lat/long'].str[0]
df['long'] = df['lat/long'].str[1]

输出:

  Col1               Polyline               lat/long       lat      long
0    A  onl~Fj|cvOrsEg}@rHuvK  (41.81268, -87.60439)  41.81268 -87.60439
1    B  onl~Fj|cvOrsEg}@rHuvK  (41.81268, -87.60439)  41.81268 -87.60439
2    C  onl~Fj|cvOrsEg}@rHuvK  (41.81268, -87.60439)  41.81268 -87.60439

最后删除lat/long列:

df = df.drop(columns='lat/long')

输出:

  Col1               Polyline       lat      long
0    A  onl~Fj|cvOrsEg}@rHuvK  41.81268 -87.60439
1    B  onl~Fj|cvOrsEg}@rHuvK  41.81268 -87.60439
2    C  onl~Fj|cvOrsEg}@rHuvK  41.81268 -87.60439

【讨论】:

  • 它看起来像我需要的解决方案,但我得到了两个错误之一,具体取决于我放在方括号中的内容:rides['lat/long'] = rides['polyline'].map(lambda x: polyline.decode(x)[2]) 这给了我一个错误:list index out范围 当我尝试时(我想我应该使用 [-1] 因为我需要从列表中获取最后一项:rides['lat/long'] = rides['polyline'].map(lambda x: polyline.decode(x)[-1]) 它给了我一个错误:字符串索引超出范围
  • 嗯,这听起来可能会发生,因为使用 polyline.decode(x) 后的某些值没有被正确解码,因此返回一些空的东西(这就是为什么 [-1] 会产生索引错误。也许我们可以尝试使用 np.where() 来过滤这种情况。让我在接下来的几个小时内更新我的答案
猜你喜欢
  • 2012-02-11
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2012-03-04
  • 2019-12-14
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多