如何在Pandas中按条件为整个分组标记标签?
Pandas按分组批量标记标签(组内满足条件则全组标记)
需求说明
当working_group分组内存在任意一行满足size >=2且process为pending时,整个分组的state列都标记为not_done;其余分组标记为something_else。
解决方案
原代码仅给满足条件的单行打标签,未扩展到整个分组。以下是两种高效实现方式:
方法1:先筛选目标分组再批量标记(性能更优)
先提取所有符合条件的working_group,再通过匹配分组给整组打标签:
import numpy as np import pandas as pd df = pd.DataFrame({"id": [1, 2, 3, 4, 5, 6, 7, 8], "process": ["pending", "finished", "finished", "finished", "finished", "finished", "finished", "pending"], "working_group": ["a", "a", "c", "d", "d", "f", "g", "g"], "size": [2, 2, 1, 2, 2, 1, 2, 2]}) # 1. 提取所有满足条件的working_group(去重) pending_groups = df[(df['size'] >= 2) & (df['process'] == 'pending')]['working_group'].unique() # 2. 给整个分组标记标签 df['state'] = np.where(df['working_group'].isin(pending_groups), 'not_done', 'something_else')
方法2:分组后用transform判断(逻辑更直观)
通过groupby结合transform,直接在组内判断是否存在满足条件的行,返回同长度的结果列:
import numpy as np import pandas as pd df = pd.DataFrame({"id": [1, 2, 3, 4, 5, 6, 7, 8], "process": ["pending", "finished", "finished", "finished", "finished", "finished", "finished", "pending"], "working_group": ["a", "a", "c", "d", "d", "f", "g", "g"], "size": [2, 2, 1, 2, 2, 1, 2, 2]}) # 按working_group分组,判断组内是否有满足条件的行,返回对应标签 df['state'] = df.groupby('working_group').transform( lambda group: 'not_done' if ((group['size'] >= 2) & (group['process'] == 'pending')).any() else 'something_else' )['process'] # 取任意列均可,transform返回与原DataFrame同长度的Series
运行结果
执行上述任意一种方法后,得到的DataFrame如下:
id process working_group size state 0 1 pending a 2 not_done 1 2 finished a 2 not_done 2 3 finished c 1 something_else 3 4 finished d 2 something_else 4 5 finished d 2 something_else 5 6 finished f 1 something_else 6 7 finished g 2 not_done 7 8 pending g 2 not_done
内容的提问来源于stack exchange,提问作者Googme
相关产品推荐
相关产品推荐

