Вот как выглядит мой фрейм данных (df):
id,activity_date,status01_1,status01_2,status02,status03_01,status03_02, status04
1,2020-12-09 22:13:16,0,0,3560,0,0,0
1,2020-12-10 01:02:33,8327,0,0,0,0,0
1,2020-12-11 01:02:33,0,0,230,0,0,0
Я хотел бы узнать, превышает ли какой-либо из столбцов состояния 01 и 03 постоянное значение 2000, и установить другой столбец (флаг), чтобы указать, что значение больше 2000. Таким образом, во входных строках выше 1 и 2 будут удовлетворять условию, но не 3.
Решение, которое я могу придумать, состоит в том, чтобы отфильтровать фрейм данных, чтобы в новом фрейме данных были только столбцы состояния 01 и 03, и использовать сложное предложение np.where для установки флага.
df1 = df[[status01,status03]]
df1[more_than_2000] = np.where((df1['status01_01'] >= 2000) | (df1['status01_02'] >= 2000) | ...), 1,0)
Что является гораздо лучшим способом сделать это?
Вы можете использовать функцию max()
здесь:
col_max = df1[['status01_01', 'status01_02', ...]].max(axis = 1)
df1[more_than_2000] = df1[col_max >= 2000]
Вы имеете в виду max(1)
? Кроме того, ваш код, похоже, не работает так, как ожидалось OP.
Давай попробуем:
df1['ge_2000'] = df1.filter(like='status01').max(axis=1).ge(2000).astype(int)
Или
df1['ge_2000'] = df1.filter(like='status01').ge(2000).any(axis=1).astype(int)
Выход:
id activity_date status01_1 status01_2 status02 status03_01 status03_02 status04 ge_2000
-- ---- ------------------- ------------ ------------ ---------- ------------- ------------- ----------- ---------
0 1 2020-12-09 22:13:16 0 0 3560 0 nan nan 0
1 1 2020-12-10 01:02:33 8327 0 0 nan nan 1
2 1 2020-12-11 01:02:33 0 0 230 0 nan 0
Обновление: для дополнительного вопроса в комментарии:
s = df.filter(like='status')
df.join(s.groupby(s.columns.str.split('_').str[0], axis=1)
.max().gt(2000).astype(int)
.add_suffix('_ge2000')
)
like='status01', как включить сюда и like='status03'?
@Ram Предполагая, что like
принимает регулярное выражение, вы можете что-то использовать: like='status0[1-3]'
Ваши данные рваные, 4,3,4 точки данных на соответствующих строках.