перебор значений столбцов и проверка внутренних значений

#python #pandas

#python #pandas

Вопрос:

извините, я новичок в python. предположим, у меня есть фрейм данных со значениями столбцов, повторяющимися с некоторыми интервалами

dest_num dest_voltage Изменения
322 45.1 перестает отвечать
322 45.5 батарея
322 46.7 низкое напряжение
322 43.2 Нет
322 42.1 Нет
322 41.1 перестает отвечать
322 45.1 батарея
322 43.4 низкое напряжение
322 43.2 Нет
322 42.1 критическое напряжение
322 40.1 dest_outage

здесь, как мы можем видеть, перестает отвечать дважды и оба раза имеет низкое напряжение, но критическое напряжение и dest_outage только один раз. есть ли способ перебрать все «перестает отвечать» и проверить, встречаются ли все три значения столбца «низкое напряжение», «критическое напряжение» и «dest_outage», и создать еще один фрейм данных только из отфильтрованного условия?

Ответ №1:

Вам нужно создать числовой идентификатор для каждой группы, с которой начинается группа stops responding . Вы можете сделать это, проверив changes , равно ли stops responding значение, и получить совокупную сумму результатов.

Используя эту группировку, вы можете проверить, все ли значения в вашем требуемом списке находятся в changes столбце для этой группы, и отфильтровать результаты, если они есть.

Вы, конечно, можете удалить столбец group, если он больше не нужен, но, похоже, это также может быть полезно после факта.

 import pandas as pd

df = pd.DataFrame({'dest_num': [322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322],
 'dest_voltage': [45.1,45.5,46.7,43.2,42.1,41.1,45.1,43.4,43.2,42.1,40.1],
 'changes': ['stops responding','battery','low voltage','none','none',
  'stops responding','battery','low voltage','none','critical voltage',
  'dest_outage']})

values = ['low voltage','critical voltage','dest_outage']
df['group'] = df['changes'].eq('stops responding').cumsum()
df.groupby('group').filter(lambda x: all([v in x['changes'].values for v in values]))
 

Вывод

    dest_num dest_voltage    changes            group
5   322     41.1            stops responding    2
6   322     45.1            battery             2
7   322     43.4            low voltage         2
8   322     43.2            none                2
9   322     42.1            critical voltage    2
10  322     40.1            dest_outage         2