如何筛选保留包含指定Fruit的ID对应的所有DataFrame行
筛选包含指定记录的ID的所有行
给定包含ID和Fruit列的长格式DataFrame(ID和Fruit均可能重复),需求为:保留所有至少存在一条Apple记录的ID的全部行,删除无Apple记录的ID的所有行。
示例数据
先构造符合场景的示例DataFrame:
import pandas as pd data = { 'ID': [1,1,1,1,1,2,2,2,2,2,3,3], 'Fruit': ['Apple','Apple','Apple','Orange','Orange','Orange','Orange','Orange','Orange','Orange','Apple','Banana'] } df = pd.DataFrame(data)
示例中ID1包含Apple和Orange记录,ID2全为Orange,ID3包含Apple和Banana,最终需保留ID1、ID3的所有行。
解决方法
方法1:使用groupby+transform广播判断结果
通过分组后对每个ID组判断是否存在Apple,再将结果广播到每行实现过滤:
# 生成每行对应的ID是否包含Apple的布尔值 has_apple = df.groupby('ID')['Fruit'].transform(lambda x: (x == 'Apple').any()) # 过滤得到目标DataFrame filtered_df = df[has_apple]
方法2:先提取有效ID再筛选
先获取所有包含Apple记录的ID集合,再用isin过滤这些ID的所有行:
# 提取所有存在Apple记录的ID valid_ids = df[df['Fruit'] == 'Apple']['ID'].unique() # 保留有效ID的全部行 filtered_df = df[df['ID'].isin(valid_ids)]
两种方法均可实现需求:方法1无需额外存储ID集合,直接基于原DataFrame处理;方法2若需复用有效ID列表则更灵活。
内容的提问来源于stack exchange,提问作者radarsh
相关产品推荐
相关产品推荐

