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

如何基于另一个DataFrame的pid删除目标DataFrame中的行?

解决df2中筛选pid存在于df1的行的问题

嘿,我来帮你搞定这个需求!你要删除df2里pid没在df1出现过的行,本质就是筛选出df2中pid存在于df1的子集,用pandas有几种简单的方法可以实现,我给你一步步演示:

先还原你的示例数据

首先我们先把你给出的两个DataFrame用代码创建出来,方便后续测试:

import pandas as pd

df1 = pd.DataFrame({
    'pid': [121, 132, 132, 145],
    'name': ['John', 'Mary', 'Jim', 'Kim'],
    'age': [36, 26, 46, 50]
})

df2 = pd.DataFrame({
    'pid': [121, 132, 132, 155],
    'name': ['John', 'Tom', 'Susan', 'Kim'],
    'age': [32, 28, 40, 50]
})

方法一:用isin()快速筛选(推荐)

这是最直接简洁的方式,利用布尔索引来过滤行:

# 提取df1中所有不重复的pid,再筛选df2中pid属于这个集合的行
filtered_df2 = df2[df2['pid'].isin(df1['pid'].unique())]

原理说明:

  • df1['pid'].unique():先获取df1里所有不重复的pid值,得到array([121, 132, 145])
  • df2['pid'].isin(...):生成一个布尔序列,标记df2每一行的pid是否在上面的集合里
  • 最后用这个布尔序列对df2做索引,就只保留符合条件的行

运行后filtered_df2的结果就是:

pidnameage
121John32
132Tom28
132Susan40

方法二:用merge内连接实现

如果之后你有更复杂的关联需求,也可以用内连接的方式来筛选:

# 只取df1的pid列和df2做内连接,自动保留两边都存在pid的行
filtered_df2 = pd.merge(df2, df1[['pid']], on='pid', how='inner').drop_duplicates()

原理说明:

  • 我们只把df1的pid列拿出来和df2做内连接,这样只会保留两个DataFrame共有的pid对应的行
  • drop_duplicates()是为了避免因为df1里有重复pid(比如132出现两次)导致结果出现重复行,如果你确定df2本身没有重复行的话,这一步也可以省略

两种方法都能达到你想要的效果,日常用isin()就足够高效啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:39:20