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

求问:此类DataFrame关联筛选操作的专业术语与高效实现方式

专业术语:半连接(Semi-Join)

你要实现的这个操作叫做半连接(Semi-Join),核心逻辑是:保留左表中所有在右表存在匹配关联键的行,右表仅用于判断匹配性,不会将自身数据合并到结果中。对应你的需求,就是保留DF1中所有A列值存在于「B列等于指定值的行的A列集合」中的行。

实现示例(Pandas)

以你给出的示例数据为例,用Pandas可以通过两种高效的矢量化方式实现,完全不需要循环:

方法1:利用isin()筛选

import pandas as pd

# 构造示例DF1
data = {
    'Person': ['Geoff', 'Sue', 'Geoff', 'Geoff', 'Mary', 'Tom'],
    'Possession': ['Cat', 'Cat', 'Dog', 'Cat', 'Cat', 'Dog'],
    'Cost': [3, 4, 10, 11, 1, 55]
}
DF1 = pd.DataFrame(data)

# 第一步:获取所有"养猫人"的Person列表
cat_owners = DF1[DF1['Possession'] == 'Cat']['Person'].unique()

# 第二步:筛选DF1中Person属于养猫人列表的所有行
DF2 = DF1[DF1['Person'].isin(cat_owners)]

方法2:利用merge()实现半连接

# 筛选出养猫人的行作为右表(仅保留Person列并去重)
right_df = DF1[DF1['Possession'] == 'Cat'][['Person']].drop_duplicates()

# 通过merge实现半连接逻辑
DF2 = DF1.merge(right_df, on='Person', how='inner').drop_duplicates()

运行后得到的DF2结果如下:

Person Possession  Cost
0  Geoff        Cat     3
1    Sue        Cat     4
2  Geoff        Dog    10
3  Geoff        Cat    11
4   Mary        Cat     1

半连接是关系型数据库和数据处理工具中的标准化数据变换操作,和你提到的groupby、pivot属于同一类常用操作,掌握后可以高效实现这类关联筛选需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:00:23