Pandas如何基于两列去重并仅删除另一列为空的重复行
Pandas 实现需求最优方案
核心逻辑
通过向量化的分组统计+布尔索引实现,全程调用Pandas原生高性能接口,时间复杂度为O(n),适合各类数据量场景。
实现代码
1. 构造示例数据
import pandas as pd import numpy as np df = pd.DataFrame({ "City": ["Chicago", "Sacramento", "Sacramento", "Naperville"], "Country": ["US", "US", "US", "US"], "State": ["IL", "CA", np.nan, "IL"] })
2. 核心过滤逻辑
# 计算每行所属 City+Country 分组的总长度,判断是否为重复分组 group_size = df.groupby(["City", "Country"])["City"].transform("size") # 定义要删除的行规则:属于重复分组 + State列为空 drop_mask = (group_size > 1) & df["State"].isna() # 过滤得到结果 df_result = df[~drop_mask]
方案说明
- 用
transform返回和原数据等长的分组长度序列,避免分组后拼接的额外开销 - 布尔索引过滤是Pandas性能最高的行筛选方式,比
apply、循环遍历等方式快1~2个数量级 - 逻辑清晰易读,可直接适配空值定义(比如State是空字符串的场景,只需要修改
df["State"].isna()为对应判断逻辑即可)
运行后结果会自动删除索引为2的行,完全符合需求。
内容的提问来源于stack exchange,提问作者anu
相关产品推荐
相关产品推荐

