如何基于另一个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的结果就是:
| pid | name | age |
|---|---|---|
| 121 | John | 32 |
| 132 | Tom | 28 |
| 132 | Susan | 40 |
方法二:用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
相关产品推荐
相关产品推荐

