如何用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()
关键说明:
- 空DataFrame初始化:用
iloc[0:0]创建和原数据列结构一致的空DataFrame,避免后续拼接出错。 - 遍历行数据:用
iterrows()遍历每一行,_用来接收不需要的索引值,row是当前行的Series对象。 - 条件判断:针对单个行的经纬度数值做范围判断,符合条件的行转成DataFrame后拼接到结果中。
- 列名匹配:确保代码中的
XGCSWGS84和YGCSWGS84是你DataFrame中实际的经纬度列名,和原loc代码的Latitude/Longitude对应上。
注意:
这种循环遍历的方式效率远低于loc方法,因为loc是pandas的矢量化操作,底层用C实现,处理大数据量时速度差很多。如果不是为了学习循环逻辑,优先用原loc方法。
内容的提问来源于stack exchange,提问作者zandekan
相关产品推荐
相关产品推荐

