我在 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 中找到,见下文)来匹配具有“有效”纬度/经度值的所有单元格。但是,我还需要提取
这些数字,并将它们放入自己的一系列中(然后在逗号上调用 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
显然,它的匹配超出了我的预期(我只需要列 0、1 和 4),但简单地删除它们对我来说太过麻烦。请注意,提取函数在开始时也去掉了 +/- 符号。如果有人有解决方案,我将不胜感激。
最佳答案
@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)检查每个部分是否有效(您所需要做的就是检查它是否是一个数字,尽管您可以采取额外的步骤来确保它落入有效纬度或经度的数字范围内)
关于python - 如何在 Pandas 中贪婪地*提取*纬度和经度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31799681/