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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:31:12