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

如何基于两列关联值数量对Pandas DataFrame进行子集筛选?

Pandas DataFrame行筛选:基于c1分组下c2不同值数量的子集提取

示例数据重建代码

import pandas as pd

df = pd.DataFrame({
    "": [0,1,2,3,4,5,6,7,8],
    "c1": ["ABC", "ABC", "dfg", "dfg", "dfg","dfg","ghj","ghj","ghj"], 
    "c2": ["delta", "delta", "alpha", "bravo", "alpha","bravo","bravo","delta","alpha"], 
    "c3": [1, 2, 2, 3, 5,6,3,3,3], 
    "col4": [786, 787, 777, 775, 767,715,772,712,712], 
    "col5": [10, 11, 13, 12, 13,12,14,12,12], 
    "col6": [1,2,4, 3, 4,3, 5, 8,8]
})

原始DataFrame

c1     c2  c3  col4  col5  col6
0  ABC  delta   1   786    10     1
1  ABC  delta   2   787    11     2
2  dfg  alpha   2   777    13     4
3  dfg  bravo   3   775    12     3
4  dfg  alpha   5   767    13     4
5  dfg  bravo   6   715    12     3
6  ghj  bravo   3   772    14     5
7  ghj  delta   3   712    12     8
8  ghj  alpha   3   712    12     8

一、筛选c1每个值仅对应c2中2个不同值的行

通过groupby+transform计算每个c1分组下c2的唯一值数量,再用布尔索引筛选目标行:

# 计算每个c1分组对应的c2唯一值数量
unique_c2_count = df.groupby('c1')['c2'].transform('nunique')
# 筛选数量等于2的行
finaldf1 = df[unique_c2_count == 2]

筛选结果

c1     c2  c3  col4  col5  col6
2  dfg  alpha   2   777    13     4
3  dfg  bravo   3   775    12     3
4  dfg  alpha   5   767    13     4
5  dfg  bravo   6   715    12     3

二、筛选c1每个值对应c2中2个或3个不同值的行

沿用相同的分组计算逻辑,将筛选条件改为匹配2或3的数量范围:

# 计算每个c1分组对应的c2唯一值数量
unique_c2_count = df.groupby('c1')['c2'].transform('nunique')
# 筛选数量为2或3的行
finaldf2 = df[unique_c2_count.isin([2, 3])]

筛选结果

c1     c2  c3  col4  col5  col6
2  dfg  alpha   2   777    13     4
3  dfg  bravo   3   775    12     3
4  dfg  alpha   5   767    13     4
5  dfg  bravo   6   715    12     3
6  ghj  bravo   3   772    14     5
7  ghj  delta   3   712    12     8
8  ghj  alpha   3   712    12     8

内容的提问来源于stack exchange,提问作者AAA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:50:38