基于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
相关产品推荐
相关产品推荐

