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

如何基于Pandas DataFrame列值去重,指定城市仅保留唯一行

Pandas按指定城市列表选择性去重

问题说明

现有如下Pandas DataFrame:

Revenue     City
27          "New York"
59          "New York"
52          "New York"
34          "London"
14          "London"
24          "London"
45          "Tokyo"
54          "Los Angeles"
24          "Los Angeles"

需要实现:仅对["Los Angeles", "New York"]中的城市保留唯一行,不在该列表的城市保留所有行。预期输出:

Revenue     City
27          "New York"
34          "London"
14          "London"
24          "London"
45          "Tokyo"
54          "Los Angeles"

尝试了以下代码但未解决问题:

mask = ["Los Angeles", "New York"]
df = df.loc[(df['City'].duplicated(keep=False) == False) | (~df['City'].isin(mask)]

正确解决方案

可以通过拆分数据、分别处理再合并的方式实现需求:

import pandas as pd

# 构造原始数据(已有DataFrame可跳过此步)
data = {
    'Revenue': [27, 59, 52, 34, 14, 24, 45, 54, 24],
    'City': ['"New York"', '"New York"', '"New York"', '"London"', '"London"', '"London"', '"Tokyo"', '"Los Angeles"', '"Los Angeles"']
}
df = pd.DataFrame(data)

# 处理City列的引号(数据不带引号可跳过)
df['City'] = df['City'].str.strip('"')
target_cities = ["Los Angeles", "New York"]

# 1. 目标城市:去重,保留第一行
target_part = df[df['City'].isin(target_cities)].drop_duplicates(subset='City', keep='first')
# 2. 非目标城市:保留所有行
non_target_part = df[~df['City'].isin(target_cities)]

# 合并结果并重置索引
final_df = pd.concat([target_part, non_target_part]).reset_index(drop=True)
print(final_df)

代码解释

  • drop_duplicates(subset='City', keep='first'):针对目标城市按City列去重,保留每组第一行(需保留最后一行可改为keep='last')
  • 拆分处理后合并,确保非目标城市的所有行完整保留
  • 注意:若原始City列带引号,必须先去除引号,否则isin无法匹配目标城市

原代码问题分析

你之前的代码逻辑错误:
df['City'].duplicated(keep=False) == False 会筛选出完全无重复的行,但需求是对目标城市保留唯一行(无论重复多少次都留一行),而非只保留无重复的行。这个逻辑会导致目标城市的重复行被全部排除,不符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:55:17