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
相关产品推荐
相关产品推荐

