You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用if循环实现Python按坐标过滤CSV事故数据?

用if循环替代pandas.loc过滤坐标区域数据

我需要按坐标区域过滤事故数据,已经能用pandas的loc方法实现,但想改用if循环完成,不清楚if循环内的代码逻辑,请求完善代码。

原loc方法实现代码

def filterAccidentsByBounds():
    # 按给定范围过滤自行车事故DataFrame
    df_bikeAccidents_h = df_bikeAccidents.loc[
        (df_bikeAccidents['Latitude'] >= 52.302885) &
        (df_bikeAccidents['Latitude'] <= 52.453221) &
        (df_bikeAccidents['Longitude'] >= 9.584375) &
        (df_bikeAccidents['Longitude'] <= 9.902979)
    ]
    
    # 打印汉诺威的自行车事故数量
    print("汉诺威的自行车事故数量:", len(df_bikeAccidents_h))
    
    return df_bikeAccidents_h

df_bikeAccidents_h = filterAccidentsByBounds()

我尝试的if循环框架

def filterAccidentsByBounds():
    # 按给定范围过滤自行车事故DataFrame
    # df_bikeAccidents_h = ...
    # XGCSWGS84        YGCSWGS84
    # 打印汉诺威的自行车事故数量
    
    # YOUR CODE HERE
    
    df_bikeAccidents_h = df_bikeAccidents
    if df[[XGCSWGS84]] <= 52.453221 and df[[XGCSWGS84]] >= 52.302885:
        if df[[YGCSWGS84]] <= 9.902979 and df[[YGCSWGS84]] >= 9.584375
    
    
    return df_bikeAccidents_h

df_bikeAccidents_h = filterAccidentsByBounds()

修正后的if循环实现代码

直接对整个DataFrame用if判断行不通,因为df[[XGCSWGS84]]返回的是Series(一列数据),不是单个数值,无法直接做布尔判断。要实现循环过滤,需要遍历每一行数据,逐个判断坐标是否在范围内,再收集符合条件的行:

import pandas as pd

def filterAccidentsByBounds():
    # 定义坐标范围(对应汉诺威区域)
    min_lat = 52.302885
    max_lat = 52.453221
    min_lon = 9.584375
    max_lon = 9.902979
    
    # 创建空DataFrame存储过滤结果(保留原数据的列结构)
    df_bikeAccidents_h = df_bikeAccidents.iloc[0:0].copy()
    
    # 遍历每一行数据
    for _, row in df_bikeAccidents.iterrows():
        # 获取当前行的经纬度(注意列名要和你的DataFrame一致)
        current_lat = row['XGCSWGS84']
        current_lon = row['YGCSWGS84']
        
        # 判断坐标是否在指定范围内
        if (min_lat <= current_lat <= max_lat) and (min_lon <= current_lon <= max_lon):
            # 将符合条件的行添加到结果DataFrame
            df_bikeAccidents_h = pd.concat([df_bikeAccidents_h, pd.DataFrame([row])], ignore_index=True)
    
    # 打印过滤后的事故数量
    print("汉诺威的自行车事故数量:", len(df_bikeAccidents_h))
    
    return df_bikeAccidents_h

df_bikeAccidents_h = filterAccidentsByBounds()

关键说明:

  1. 空DataFrame初始化:用iloc[0:0]创建和原数据列结构一致的空DataFrame,避免后续拼接出错。
  2. 遍历行数据:用iterrows()遍历每一行,_用来接收不需要的索引值,row是当前行的Series对象。
  3. 条件判断:针对单个行的经纬度数值做范围判断,符合条件的行转成DataFrame后拼接到结果中。
  4. 列名匹配:确保代码中的XGCSWGS84和YGCSWGS84是你DataFrame中实际的经纬度列名,和原loc代码的Latitude/Longitude对应上。

注意:

这种循环遍历的方式效率远低于loc方法,因为loc是pandas的矢量化操作,底层用C实现,处理大数据量时速度差很多。如果不是为了学习循环逻辑,优先用原loc方法。

内容的提问来源于stack exchange,提问作者zandekan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:02:50