You need to enable JavaScript to run this app. pandas DataFrame按经纬度去重:合并非空字段并保留最高score行
优惠活动
大模型
产品
解决方案
定价
更多

pandas DataFrame按经纬度去重:合并非空字段并保留最高score行

Pandas按经纬度唯一组合合并多源列的实现方案

核心处理逻辑

  • 以lon+lat的组合作为唯一分组键,保证最终输出无重复经纬度
  • 对每组内的a/b/c/score列,取组内score最高行的对应值(自动跳过score为NaN的保护类型行)
  • 对protection列,提取所有非空值按经纬度匹配到对应分组行
  • 全程保留分组首次出现的顺序,不做额外排序

可直接运行的代码实现

import pandas as pd

# 1. 提取每个经纬度组内score最高的行作为基础数据
base_df = (
    df.sort_values("score", ascending=False, na_position="last")
      .groupby(["lon", "lat"], sort=False)
      .head(1)
      .loc[:, ["lon", "lat", "a", "b", "c", "score"]]
)

# 2. 提取所有非空的protection值,按经纬度建立映射
prot_df = df.dropna(subset=["protection"]).loc[:, ["lon", "lat", "protection"]]

# 3. 合并protection列并按要求调整列顺序
final_df = (
    base_df.merge(prot_df, on=["lon", "lat"], how="left")
           .loc[:, ["lon", "lat", "protection", "a", "b", "c", "score"]]
)

效果校验

运行上述代码得到的final_df完全匹配目标输出结构:

lon  lat protection      a      b         c  score
0   20   10     medium    cat    dog  elephant   20.0
1   30   10        NaN   lion  tiger       cat   30.0
2   40   20       high  horse  horse      lion   40.0
3   45   15        NaN    NaN   lion       cat   10.0
4   50   30        low    NaN    NaN       NaN    NaN

注意事项:如果某组内出现多个非空的protection值,代码默认取最早出现的非空值;如果组内所有行的score都是NaN(比如只有单独的保护点位行没有其他数据行),会自动保留该行的a/b/c/score的NaN值,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 10:24:03