如何基于列中非匹配值筛选DataFrame?去除重复行政区
解决方案
核心需求:保留2017年所有记录,2018、2019年仅保留未在2017年出现过的行政区记录。
步骤1:构建原始DataFrame
先把你的数据转换成可操作的DataFrame:
import pandas as pd data = { 'year': [2017,2017,2017,2018,2018,2018,2019,2019,2019], 'district': ['arrah','buxar','rohtas','rohtas','arwal','seohar','nawda','buxar','jamui'] } df = pd.DataFrame(data)
步骤2:拆分筛选数据
- 直接提取2017年全部记录:
df_2017 = df[df['year'] == 2017]
- 筛选2018、2019年的有效记录:
先拿到2017年出现过的行政区列表,再从后续年份中剔除这些行政区的记录:
# 获取2017年的所有行政区 districts_2017 = df_2017['district'].unique() # 筛选2018/2019年中,未在2017年出现的行政区记录 df_later_filtered = df[df['year'].isin([2018,2019]) & ~df['district'].isin(districts_2017)]
步骤3:合并并整理结果
把两部分数据合并,按年份排序后得到目标子集:
result = pd.concat([df_2017, df_later_filtered]).sort_values('year').reset_index(drop=True)
运行后输出结果:
year district 0 2017 arrah 1 2017 buxar 2 2017 rohtas 3 2018 arwal 4 2018 seohar 5 2019 nawda 6 2019 jamui
关于anti_join的补充
如果想用anti_join实现,本质是用后续年份数据和2017年行政区做反向关联,写法如下:
df_later_filtered = pd.merge(df[df['year'].isin([2018,2019])], df_2017[['district']], on='district', how='anti')
合并后同样能得到目标结果,之前没成功可能是关联对象或语法有误。
内容的提问来源于stack exchange,提问作者gis.rajan
相关产品推荐
相关产品推荐

