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

Pandas DataFrame处理百万级数据过慢?经纬度匹配合并数据求助

嘿,这个问题我之前处理过类似的百万级空间匹配场景,直接两两计算每个碰撞点和所有天气点的距离肯定行不通——120万×10.9万的计算量会把你的CPU和内存直接榨干,得换更高效的思路!

核心问题分析

你当前的思路是O(n*m)的时间复杂度,对于百万级数据集来说完全不现实。我们需要用空间索引把匹配的时间复杂度降到O(n log m),同时配合数据预处理减少无效计算。

解决方案步骤

1. 数据预处理:清洗+类型优化

先处理两个数据集的无效值,同时优化数据类型减少内存占用:

import pandas as pd
import numpy as np
from scipy.spatial import KDTree
from math import radians

# 加载碰撞数据,指定dtype压缩内存
collisions_df = pd.read_csv(
    "NYPD_Motor_Collisions.csv",
    dtype={
        "LATITUDE": np.float32,
        "LONGITUDE": np.float32
    }
)
# 过滤掉经纬度为空的无效行
collisions_df = collisions_df.dropna(subset=["LATITUDE", "LONGITUDE"])

# 加载天气数据(如果是txt格式需指定分隔符,比如sep="\t")
weather_df = pd.read_csv(
    "weatherfinal.txt",
    dtype={
        "lat": np.float32,
        "lon": np.float32,
        "temp": np.float32,
        "prec": np.float32
    }
)
weather_df = weather_df.dropna(subset=["lat", "lon"])

2. 构建KDTree实现快速近邻搜索

KDTree是专门用于高效空间近邻查询的数据结构,能快速定位每个碰撞点附近的天气站点:

# 把经纬度转换成弧度(KDTree用欧氏距离计算时,弧度下的结果近似球面距离)
weather_coords = np.radians(weather_df[["lat", "lon"]].values)
collision_coords = np.radians(collisions_df[["LATITUDE", "LONGITUDE"]].values)

# 构建KDTree索引
kdtree = KDTree(weather_coords)

# 查询每个碰撞点最近的1个天气点,返回距离(弧度单位)和对应天气数据的索引
distances, indices = kdtree.query(collision_coords, k=1)

# 把弧度距离转换成实际公里数(地球半径≈6371公里)
distances_km = distances * 6371

3. 合并数据并过滤异常匹配

将匹配到的气温、降水量合并到碰撞数据,同时可设置距离阈值过滤无效匹配:

# 把天气数据的temp和prec映射到碰撞数据中
collisions_df["temp"] = weather_df.iloc[indices]["temp"].values
collisions_df["prec"] = weather_df.iloc[indices]["prec"].values
collisions_df["match_distance_km"] = distances_km

# 过滤掉匹配距离超过5公里的行(可根据实际站点密度调整阈值)
collisions_df = collisions_df[collisions_df["match_distance_km"] <= 5.0]

4. 进阶优化:结合时间维度(如果有)

如果天气数据包含观测时间,建议先按碰撞事件的时间过滤天气数据,再做空间匹配,能进一步缩小计算规模:

# 假设碰撞数据有"DATE"字段,天气数据有"observation_time"字段
collisions_df["DATE"] = pd.to_datetime(collisions_df["DATE"])
weather_df["observation_time"] = pd.to_datetime(weather_df["observation_time"])

# 先按时间匹配最近的天气数据子集
collisions_with_weather = pd.merge_asof(
    collisions_df.sort_values("DATE"),
    weather_df.sort_values("observation_time"),
    left_on="DATE",
    right_on="observation_time",
    direction="nearest"
)
# 再对每个时间范围内的子集构建KDTree做空间匹配

关键注意事项

  • 距离阈值:根据站点密度调整,城市内站点密集可设2-5公里,郊区站点稀疏可适当放大。
  • 内存管理:如果数据仍超出内存,用Pandas的chunksize参数分块加载处理。
  • 结果验证:随机抽取匹配结果手动检查,确保经纬度和距离的合理性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:45:10