【问题标题】:apply function to dataframe column having lat-long and remove rows for invalid lat-long将函数应用于具有 lat-long 的数据框列并删除无效 lat-long 的行
【发布时间】:2020-04-03 06:57:26
【问题描述】:

我有一个如下的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)

对于 100 万条记录,有什么有效的方法可以做到这一点吗?一旦删除了错误的经纬度条目,我想在 df1-"Latitude""Longitude" 的末尾填充两个新列并填充相应的值。

【问题讨论】:

    标签: python pandas location


    【解决方案1】:

    我会按照以下方式进行:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2019-03-17
      • 2017-12-13
      相关资源
      最近更新 更多