将函数应用于具有lat-long的数据框列,并删除无效的lat-long的行

问题描述 投票:0回答:1

我有一个datafrme df1,如下所示:lat-long可以重复

miles uid lat_long
12    235  (45,67)
13    234  (41.09,67)
14    233  (34,55)
15    236  (12.23,65.78)
16    239  (27,34)

如果lat_long值无效,我想从df1中删除条目。我像下面这样进行操作,但是花费了太多时间。

all_lat_long = df1["lat_long"].tolist(). #list of tuples
def lat_long_check(each_coordnts):
        match = re.match('^\((?P<lat>-?\d*(.\d+)),(?P<long>-?\d*(.\d+))\)$',
                         str(each_coordnts))   #find invalid lat-long
        if match is None:
            idx = df1[df1['lat_long'] == each_coordnts].index
            df1.drop(idx,inplace=True)

for each_coordnts in  all_lat_long:
    lat_long_check(each_coordnts)

对于1M条记录,有没有有效的方法?删除错误的经纬度条目后,我想在df1-“ Latitude”“ Longitude”的末尾填充两个新列,并填充相应的值。

python pandas location
1个回答
0
投票

我将进行如下操作:

  1. 定义一个函数validate_lat_long,如果纬度/经度值正确,该函数将返回一个浮点元组。我认为这与检查值是否在预期间隔内有关(纬度为-90到90等)有关。如果值不正确,该函数应返回np.nan
  2. 创建具有正确值的新列,如下所示:
df1["validated_lat_long"] = df1["lat_long"].apply(validate_lat_long)
  1. 最后,为了删除无效值,如果需要保留以前的工作,请在新列上使用dropna,并可能创建一个新的数据框:
new_df = df1.dropna(subset=["validated_lat_long"])

您的代码很可能很慢,因为它会在数据帧行上进行迭代。用df.apply()应用功能应该可以合理地加快速度。我也希望您可以检查浮点数而不是搜索正则表达式。

© www.soinside.com 2019 - 2024. All rights reserved.