我在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),但简单地删除它们对我来说太过分了。请注意,提取函数在开头也没有删除+/-符号。如果有人有解决方案,我真的很感激。
答案 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)检查每件作品是否有效(您需要做的就是检查它是否为数字,尽管您可以采取额外的步骤,使其落入有效纬度或经度的数字范围内)