Мне нужно установить флаг 1 для каждого сотрудника в группе (группировать по MNGR, ГОД), если у любого из сотрудников в группе значение любого из столбцов V1, V2, V3 или V4 больше 14. Я могу заставить это работать. если проверяется только 1 столбец, но столбцы V могут содержать более 10 столбцов.
У меня есть этот код:
DF1['flg'] = [1 for i in range(1, 5) if DF1[f'V{i}'].gt(14).any().groupby(by=['MNGR', 'YEAR']).replace({True: 1, False: 0}).reindex_like(DF1) ]
Но я получил ошибку:
AttributeError: 'numpy.bool_' object has no attribute 'groupby'
DF1 = pd.DataFrame({'EMPLID': [12, 13, 14, 15, 16, 17, 18], 'MNGR': ['BOB', 'JIM', 'RHONDA', 'RHONDA', 'JIM', 'RHONDA', 'RHONDA'], 'YEAR': [2012, 2013, 2012, 2012, 2012, 2013, 2012], 'V1': [1,2,3,4,5,6,7], 'V2': [2,3,4,50,6,7,8], 'V3': [3,3,3,3,3,3,3], 'V4': [7,15,8,9,10,11,12]})
Ожидаемый результат:
EMPLID MNGR YEAR V1 V2 V3 V4 flg
0 12 BOB 2012 1 2 3 7 NaN
1 13 JIM 2013 2 3 3 15 1
2 14 RHONDA 2012 3 4 3 8 1
3 15 RHONDA 2012 4 50 3 9 1
4 16 JIM 2012 5 6 3 10 NaN
5 17 RHONDA 2013 6 7 3 11 NaN
6 18 RHONDA 2012 7 8 3 12 1






Вы можете разбить это преобразование на два отдельных шага:
['MNGR', 'YEAR'], где ЛЮБАЯ строка соответствует указанному вышеimport pandas as pd
import numpy as np
df = pd.DataFrame({
'EMPLID': [12, 13, 14, 15, 16, 17, 18],
'MNGR': ['BOB', 'JIM', 'RHONDA', 'RHONDA', 'JIM', 'RHONDA', 'RHONDA'],
'YEAR': [2012, 2013, 2012, 2012, 2012, 2013, 2012],
'V1': [1,2,3,4,5,6,7],
'V2': [2,3,4,50,6,7,8],
'V3': [3,3,3,3,3,3,3],
'V4': [7,15,8,9,10,11,12]
})
df['flag'] = (
df.filter(regex=r'^V.+').gt(14).any(axis=1) # 1.
.groupby([df['MNGR'], df['YEAR']]).transform('any') # 2.
.astype(int)
)
print(df)
# EMPLID MNGR YEAR V1 V2 V3 V4 flag
# 0 12 BOB 2012 1 2 3 7 0
# 1 13 JIM 2013 2 3 3 15 1
# 2 14 RHONDA 2012 3 4 3 8 1
# 3 15 RHONDA 2012 4 50 3 9 1
# 4 16 JIM 2012 5 6 3 10 0
# 5 17 RHONDA 2013 6 7 3 11 0
# 6 18 RHONDA 2012 7 8 3 12 1