Pandas多列条件结合GroupBy设置员工组标记的报错解决
Pandas分组批量标记满足条件的组
错误原因分析
你碰到的AttributeError: 'numpy.bool_' object has no attribute 'groupby',本质是误将单个布尔值(而非DataFrame/Series)作为groupby的调用对象。比如错误写法可能是直接对df[cols].gt(14).any()(未指定axis参数时返回单个布尔值)调用groupby,自然触发报错。
正确实现方案
核心思路:先判断组内是否存在任意员工的指定列数值>14,再将组级结果映射到组内每一行。
步骤示例
先准备测试数据:
import pandas as pd import numpy as np # 示例输入数据 df = pd.DataFrame({ 'MNGR': ['A', 'A', 'A', 'B', 'B'], 'YEAR': [2023, 2023, 2024, 2023, 2023], 'V1': [10, 15, 12, 13, 11], 'V2': [12, 13, 16, 10, 12], 'EMP_ID': ['E1', 'E2', 'E3', 'E4', 'E5'] })
方法1:分步实现(易理解)
# 1. 定义需要检查的列(可扩展到任意多列) check_cols = ['V1', 'V2'] # 2. 标记每行员工是否有指定列>14 row_qualifies = df[check_cols].gt(14).any(axis=1) # 3. 按MNGR+YEAR分组,判断组内是否有符合条件的员工,映射回原表 df['flg'] = df.groupby(['MNGR', 'YEAR'])['EMP_ID'].transform( lambda group: 1 if row_qualifies[group.index].any() else np.nan )
方法2:简洁写法(一步到位)
check_cols = ['V1', 'V2'] df['flg'] = df.groupby(['MNGR', 'YEAR'])[check_cols].transform( lambda g: 1 if g.gt(14).any().any() else np.nan )
期望输出
MNGR YEAR V1 V2 EMP_ID flg 0 A 2023 10 12 E1 1.0 1 A 2023 15 13 E2 1.0 2 A 2024 12 16 E3 1.0 3 B 2023 13 10 E4 NaN 4 B 2023 11 12 E5 NaN
代码说明
gt(14):对指定列的每个元素做>14的布尔判断any(axis=1):判断每行是否有至少一个列满足条件(即该员工符合要求)groupby(...).transform:将分组计算的结果(组内是否有符合条件的员工)同步到组内每一行,保证同组所有员工的flg值一致- 方法2中
g.gt(14).any().any():第一个any()判断该行是否满足,第二个any()判断整个组是否存在至少一行满足
内容的提问来源于stack exchange,提问作者bione_g dgrace
相关产品推荐
相关产品推荐

