如何*在熊猫​​中贪婪地提取*纬度和经度?

时间:2015-08-04 02:23:22

标签: python regex pandas

我在Pandas中有一个像这样的数据框:

        id          loc
 40     100005090   -38.229889,-72.326819   
 188    100020985   ut: -33.442101,-70.650327   
 249    10002732    ut: -33.437478,-70.614637   
 361    100039605   ut: 10.646041,-71.619039    \N
 440    100048229   4.666439,-74.071554

我需要提取gps点数。我首先要求包含某个正则表达式(在SO中找到,见下文)以匹配具有“有效”纬度/长值的所有单元格。但是,我还需要extract这些数字,并将它们放在一系列自己的(然后在逗号上调用split)或将它们放入两个新的pandas系列中。我已经尝试了以下提取部分:

ids_with_latlong["loc"].str.extract("[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$")

但由于输出结果,看起来reg exp没有贪婪地进行匹配,因为我得到这样的结果:

    0   1            2      3   4           5   6       7    8
    40  38.229889   .229889 NaN 72.326819   NaN 72  NaN 72  .326819
    188 33.442101   .442101 NaN 70.650327   NaN 70  NaN 70  .650327

显然它的匹配比我想要的多(我只需要cols 0,1和4),但简单地删除它们对我来说太过分了。请注意,提取函数在开头也没有删除+/-符号。如果有人有解决方案,我真的很感激。

2 个答案:

答案 0 :(得分:1)

您可以使用(?:)忽略该群组:

df["loc"].str.extract(r"((?:[\+-])?\d+\.\d+)\s*,\s*((?:[\+-])?\d+\.\d+)")

答案 1 :(得分:1)

@ HYRY的回答对我来说非常好。这只是一种使用内置pandas方法而不是正则表达式方法的替代方法。我认为阅读起来有点简单,但我不确定它是否足以满足您的所有情况(虽然它在这个样本数据上运行良好)。

df['loc'] = df['loc'].str.replace('ut: ','')
df['lat'] = df['loc'].apply( lambda x: x.split(',')[0] )
df['lon'] = df['loc'].apply( lambda x: x.split(',')[1] )

          id                    loc         lat         lon
0  100005090  -38.229889,-72.326819  -38.229889  -72.326819
1  100020985  -33.442101,-70.650327  -33.442101  -70.650327
2   10002732  -33.437478,-70.614637  -33.437478  -70.614637
3  100039605   10.646041,-71.619039   10.646041  -71.619039
4  100048229    4.666439,-74.071554    4.666439  -74.071554

作为此类方法的一般建议,您可以考虑按以下步骤进行操作:

1)删除replace的无关字符(或者这可能是正则表达式最好的地方)

2)分成几部分

3)检查每件作品是否有效(您需要做的就是检查它是否为数字,尽管您可以采取额外的步骤,使其落入有效纬度或经度的数字范围内)