Поиск значений в нескольких столбцах, превышающих константу в pandas Dataframe

Вот как выглядит мой фрейм данных (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)

Что является гораздо лучшим способом сделать это?

Ваши данные рваные, 4,3,4 точки данных на соответствующих строках.

Scott Boston 18.12.2020 04:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
1 640
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать функцию max() здесь:

col_max = df1[['status01_01', 'status01_02', ...]].max(axis = 1)
df1[more_than_2000] = df1[col_max >= 2000]

Вы имеете в виду max(1)? Кроме того, ваш код, похоже, не работает так, как ожидалось OP.

Quang Hoang 18.12.2020 04:50
Ответ принят как подходящий

Давай попробуем:

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'?

ozzboy 18.12.2020 05:06

@Ram Предполагая, что like принимает регулярное выражение, вы можете что-то использовать: like='status0[1-3]'

Tim Biegeleisen 18.12.2020 05:24

Другие вопросы по теме