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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:50:15