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

基于Group1和Group2分组Pandas DataFrame,标记含指定列表全值的组

Pandas分组标记包含完整目标值的组

需求说明

给定如下结构的DataFrame和目标列表l1,需要按Group1和Group2列分组,检查每组的Label列是否包含l1中的所有值(顺序、重复无关),符合条件的组内所有行标记Flag=1,否则标记Flag=0。

原DataFrame结构:

Group1 Group2 Label
G1     A1    AA
G1     A1    BB
G1     A1    CC
G1     A2    AA
G1     A2    CC
G2     A1    BB
G2     A1    DD
G2     A2    AA
G2     A2    CC
G2     A2    DD
G2     A2    BB

目标列表:

l1 = ['AA','BB','CC','DD']

预期输出:

Group1 Group2 Label  Flag
G1     A1    AA     0
G1     A1    BB     0
G1     A1    CC     0
G1     A2    AA     0
G1     A2    CC     0
G2     A1    BB     0
G2     A1    DD     0
G2     A2    AA     1
G2     A2    CC     1
G2     A2    DD     1
G2     A2    BB     1

完整解决方案代码

import pandas as pd

df = pd.DataFrame({
                'Group1': [ 'G1','G1', 'G1','G1','G1',
                            'G2','G2', 'G2','G2','G2','G2'],
                'Group2': ['A1','A1','A1','A2','A2',
                            'A1','A1','A2','A2','A2','A2'],
                'Label': ['AA','BB','CC','AA','CC','BB',
                            'DD','AA','CC','DD','BB']})
l1 = ['AA','BB','CC','DD']
l1_set = set(l1)

# 分组后判断每组Label的集合是否包含目标集合,生成组级标记
group_flags = df.groupby(['Group1','Group2'])['Label'].apply(lambda x: l1_set.issubset(set(x))).astype(int)

# 将组级标记映射回原DataFrame的每一行
df['Flag'] = df.set_index(['Group1','Group2']).index.map(group_flags.get)

print(df)

代码解释

  • 先将目标列表l1转为集合l1_set,集合操作更高效,且天然忽略重复值。
  • 使用groupby按Group1和Group2分组,对每组的Label列应用lambda函数:用issubset判断目标集合是否是当前组Label集合的子集(即当前组包含所有目标值),结果转为整数1/0。
  • 通过将原DataFrame的索引设为分组键,再用index.map把组级的标记值映射到每一行,生成Flag列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:05:06