Добавление столбца во фрейм данных Pandas, который предоставляет метки в зависимости от условия - PullRequest
0 голосов
/ 24 октября 2019

У меня есть фрейм данных, заполненный данными о температуре временного ряда, и мне нужно пометить состояние оборудования как «хорошее» или «плохое» в зависимости от температуры. Это «хорошо», если между 35 и 45, и «плохо» в противном случае. Тем не менее, я хочу добавить условие, что если он возвращается к соответствующему температурному диапазону после того, как указан как «плохой», он должен быть «хорошим» в течение как минимум 2 дней, прежде чем он снова будет помечен как «хороший». До сих пор я могу маркировать на более базовом уровне, но изо всех сил пытаюсь реализовать более сложный переключатель меток.

df['status'] = ['bad' if x <35 or x >45 else 'good' for x in df['temp']]

Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 3 ]

1 голос
/ 24 октября 2019

А как насчет такого подхода?

Вы можете сделать функцию group_check для каждой строки и проверить, имеет ли эта строка какую-либо соседнюю температуру, нарушающую в группе, из более широкой df.

Это будет проверять только предыдущие измерения. Вам необходимо выполнить быструю логическую проверку текущего измерения, чтобы убедиться, что предыдущие измерения в порядке, а текущее измерение в порядке.

def group_check_maker(index, row):
    def group_check(group):
        if len(group) > 1:
          if index in group.index:
            failed_status = False
            for index2, row2 in group.drop(index).iterrows():
              if (row['Date'] > row2['Date']) and (row['Date'] - row2['Date'] < pd.Timedelta(days = 2)) and (row2['Temperature'] < 35 or row2['Temperature'] >45):
                  failed_status = True
            if failed_status:
                return 'Bad'
            else:
                return 'Good'

    return group_check

def row_checker_maker(df):
    def row_checker(row):
        group_check = group_check_maker(row.name, row)
        return df[df['Equipment ID'] == row['Equipment ID']].groupby('Equipment ID').apply(group_check).iloc[0]
    return row_checker

row_checker = row_checker_maker(df)

df['Neighboring Day Status'] = df.apply(row_checker, axis = 1)
1 голос
/ 24 октября 2019
import numpy as np    
df['status'] = np.where((df['temp']>35) | (df['temp']>45) , 'bad', 'good')

Это должно решить проблему.

0 голосов
/ 24 октября 2019

вы можете создать pd.Series со значением 'bad', заменив значения where его значениями между 35 и 45, а затем распространить значение "bad" на следующие две пустые строки с помощьюffill и предел 2 и, наконец, fillna остальное с хорошим, например:

#dummy df
df = pd.DataFrame({'temp': [36, 39, 24, 34 ,56, 42, 40, 38, 36, 37, 32, 36, 23]})

df['status'] = pd.Series('bad', index=df.index).where(df.temp.lt(35)|df.temp.gt(45))\
                                               .ffill(limit=2).fillna('good')
print (df)
    temp status
0     36   good
1     39   good
2     24    bad
3     34    bad
4     56    bad
5     42    bad #here it is 42 but the previous row is bad so still bad
6     40    bad #here it is 40 but the second previous row is bad so still bad
7     38   good #here it is good then
8     36   good
9     37   good
10    32    bad
11    36    bad
12    23    bad
...