如何用Pandas筛选满足分组大小与全类型条件的DataFrame?
Pandas筛选满足分组大小和类型集合要求的行
要实现你的需求,我们需要筛选出同时满足以下两个条件的Packet分组对应的所有行:
- 分组的行数等于指定的
n(示例中n=3) - 分组的
Type列包含全部指定类型(示例中为A、B、C)
方法一:使用groupby().filter()(直观简洁)
直接对Packet分组后,用filter函数筛选符合条件的分组:
import pandas as pd # 构造示例数据 data = { 'ID': [1,2,3,4,5,6,7,8,9,10,11,12,13,14], 'Packet': [1,1,2,2,2,3,3,4,4,5,6,6,6,7], 'Type': ['A','B','A','C','B','A','C','C','B','B','C','B','A','A'] } df = pd.DataFrame(data) # 定义参数 n = 3 required_types = {'A', 'B', 'C'} # 筛选符合条件的行 filtered_df = df.groupby('Packet').filter( lambda x: len(x) == n and set(x['Type']) == required_types ) print(filtered_df)
输出结果:
ID Packet Type 2 3 2 A 3 4 2 C 4 5 2 B 10 11 6 C 11 12 6 B 12 13 6 A
方法二:先统计分组信息再筛选(高效复用)
先计算每个Packet分组的统计数据,再筛选出符合条件的分组,最后过滤原数据:
import pandas as pd # 构造示例数据(同上) data = { 'ID': [1,2,3,4,5,6,7,8,9,10,11,12,13,14], 'Packet': [1,1,2,2,2,3,3,4,4,5,6,6,6,7], 'Type': ['A','B','A','C','B','A','C','C','B','B','C','B','A','A'] } df = pd.DataFrame(data) n = 3 required_types = {'A', 'B', 'C'} # 计算每个分组的大小和Type集合 group_stats = df.groupby('Packet').agg( group_size=('Type', 'size'), type_set=('Type', lambda x: set(x)) ).reset_index() # 筛选出有效的Packet valid_packets = group_stats[ (group_stats['group_size'] == n) & (group_stats['type_set'] == required_types) ]['Packet'].tolist() # 过滤原DataFrame filtered_df = df[df['Packet'].isin(valid_packets)] print(filtered_df)
两种方法说明
- 方法一适合快速实现,代码简洁直观,直接对每个分组做条件判断。
- 方法二更适合需要复用分组统计信息的场景,比如后续还要用到分组大小、类型集合等数据时,效率更高。
内容的提问来源于stack exchange,提问作者BBG
相关产品推荐
相关产品推荐

