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
相关产品推荐
相关产品推荐

