如何基于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
相关产品推荐
相关产品推荐

