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

Pandas:基于另一个Series的值筛选DataFrame行

解决方法:匹配ID对应的指定Fruit筛选DataFrame

嘿,这个需求其实很常见,我给你几种简洁的实现方式,都能精准筛选出每个ID对应指定Fruit的行:

首先先把你的示例数据用代码还原出来,方便测试:

import pandas as pd

# 原始DataFrame
df = pd.DataFrame({
    'id': [1, 1, 2, 2, 3, 3, 3],
    'fruit': ['apple', 'kiwi', 'melon', 'kiwi', 'mango', 'melon', 'mango']
})

# 匹配用的Series(这里我们把它处理成以id为索引的形式,方便后续匹配)
match_series = pd.Series(
    ['apple', 'kiwi', 'mango'],
    index=[1, 2, 3],
    name='fruit'
)

方法1:用map匹配预期值(最简洁高效)

这种方法利用map函数根据ID从Series中取出对应的目标Fruit,然后和原DataFrame的Fruit列做对比,只保留相等的行:

df_filtered = df[df['fruit'] == df['id'].map(match_series)]

方法2:通过合并(merge)筛选

把匹配用的Series转换成DataFrame,然后和原DataFrame做内连接,自动只保留ID和Fruit都匹配的行:

# 将Series转为带id列的DataFrame
match_df = match_series.reset_index().rename(columns={'index': 'id'})
# 内连接筛选
df_filtered = pd.merge(df, match_df, on=['id', 'fruit'], how='inner')

方法3:分组后逐组筛选(逻辑直观)

如果你想更清晰地看到每个分组的筛选过程,可以用groupby分组后,对每个ID组单独筛选符合目标Fruit的行:

def filter_single_group(group):
    # group.name就是当前组的ID值
    target_fruit = match_series.loc[group.name]
    return group[group['fruit'] == target_fruit]

df_filtered = df.groupby('id').apply(filter_single_group).reset_index(drop=True)

最终筛选结果

不管用哪种方法,最终得到的df_filtered都会是:

id   fruit
0   1   apple
1   2    kiwi
2   3   mango
3   3   mango

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:07:55