如何在Pandas DataFrame中保留含指定值的分组并移除无该值分组
按分组筛选含特定值的Pandas DataFrame最优实现
问题场景
给定以下DataFrame:
import pandas as pd d = {'value1': [1, 1, 1, 2, 3, 3, 4, 4, 4, 4], 'value2': ['A', 'B', 'C', 'C', 'A', 'B', 'B', 'A', 'A', 'B']} df = pd.DataFrame(data=d)
原始数据:
value1 value2 0 1 A 1 1 B 2 1 C 3 2 C 4 3 A 5 3 B 6 4 B 7 4 A 8 4 A 9 4 B
需求:按value1分组,仅保留那些value2列中至少包含一个'C'的分组。
最优实现方法
方法一:向量式筛选(大数据集首选)
先提取所有包含'C'的value1取值,再过滤整个DataFrame,性能最优:
# 获取所有符合条件的value1值 valid_groups = df.loc[df['value2'] == 'C', 'value1'].unique() # 过滤得到结果 result = df[df['value1'].isin(valid_groups)]
这种方法利用Pandas的向量操作,避免了逐组遍历,在数据量较大时效率远高于分组处理。
方法二:groupby + transform(直观高效)
通过transform将分组的判断结果广播到每一行,再做布尔索引:
# 标记每行所在分组是否包含'C' has_c = df.groupby('value1')['value2'].transform(lambda x: 'C' in x.values) # 筛选符合条件的行 result = df[has_c]
代码逻辑清晰,兼顾可读性和效率,适合中等规模数据集。
方法三:groupby + filter(代码最简洁)
直接用filter方法保留符合条件的分组:
result = df.groupby('value1').filter(lambda x: 'C' in x['value2'].values)
代码最简洁,但由于是逐组执行lambda,大数据集下性能不如前两种方法,适合小规模数据快速实现。
结果验证
执行上述任意方法后,得到的结果均为:
value1 value2 0 1 A 1 1 B 2 1 C 3 2 C
内容的提问来源于stack exchange,提问作者sampeterson
相关产品推荐
相关产品推荐

