将函数应用于具有latlong的dataframe列,并删除无效latlong的行

2024-09-28 05:18:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据FRMEdf1如下: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)

有没有什么有效的方法来处理一百万条记录?删除错误的lat long条目后,我希望在df1的末尾填充两个新列-“纬度”“经度”,并填充相应的值


Tags: 数据uidcheckmatch条目alllongdf1
1条回答
网友
1楼 · 发布于 2024-09-28 05:18:31

我将进行以下工作:

  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()的函数应该可以合理地加快速度。此外,我希望您可以检查浮动,而不是搜索正则表达式

相关问题 更多 >

    热门问题