Когда одна ячейка столбца имеет нулевое значение, сделайте значение в другом столбце нулевым, а ячейки под ним - нулем. - PullRequest
0 голосов
/ 27 мая 2020

Я читаю данные о температуре от датчика, который периодически включается и выключается в кадре данных df . Каждый раз, когда датчик включается, требуется примерно 5 строк данных для термического равновесия. Я хочу игнорировать уменьшенные значения температуры из времени прогрева датчика в любой статистике, которая будет запускаться в столбце температуры, а также игнорировать их при построении графика. Три столбца во фрейме данных: « Секунды », « Sensor_State » и « Температура ». Я создал четвертый столбец под названием ' Sensor_Warmup_State ', который создается с помощью al oop, и превращает все значения в 0 после того, как 0 обнаружен в Столбец « Sensor_State » в следующих 5 ячейках. Затем я умножаю « Температура » на « Sensor_Warmup_State », чтобы получить « Processed_Temp ». Это работает, но я знаю, что должно быть больше pythoni c, более быстрый способ сделать это, просто у меня пока нет опыта.

Вот что у меня есть. Чтобы создать фрейм данных:

import numpy as np
a=np.arange(1,21).tolist()
b = (np.zeros((2), dtype=int)).tolist()
c = (np.ones((18), dtype = int)).tolist()
d = b + c
e = [0,0,1,2,4,8,9,10,10,10,10,10,10,10,10,10,10,10,10,10]
data = {'Seconds': a, 'Sensor_State': d, 'Temperature': e}
df = pd.DataFrame.from_dict(data)
df['Sensor_Warmup_State'] = 0
df

Screenshot of df output

Чтобы создать последние два столбца:

NumOfRows = df['Sensor_State'].size
x=0
for index, value in df['Sensor_State'].iteritems():
    if (value == 0) & (index < NumOfRows-5):
        df['Sensor_Warmup_State'].iloc[index] = 0
    elif (value == 1) & (index < NumOfRows-5):
        df.loc[(index + 5), 'Sensor_Warmup_State'] = 1
df['Processed_Temp'] = df['Sensor_Warmup_State'] * df['Temperature']
df

Screenshot of df output with new columns

1 Ответ

0 голосов
/ 28 мая 2020

OP здесь, я придумал лучший способ, используя .shift (), это намного проще и на 30% быстрее, чем цикл, как было первоначально описано. Я отредактировал начальный фрейм данных, чтобы учесть, когда Sensor_State переходит от 0 к 1, обратно к 0 и 1, чтобы учесть эти обстоятельства. Надеюсь, это кому-то поможет:

In [1]:
import numpy as np
import pandas as pd

a=np.arange(1,24).tolist()
b=[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]
c = [0,0,1,2,4,8,9,10,10,10,0,0,0,0,0,2,4,8,10,10,10,10,10]
data = {'Seconds': a, 'Sensor_State': b, 'Temperature': c}
df = pd.DataFrame.from_dict(data)
df['Sensor_Warmup_State'] = 0
df

Out[1]: 
    Seconds  Sensor_State  Temperature  Sensor_Warmup_State
0         1             0            0                    0
1         2             0            0                    0
2         3             1            1                    0
3         4             1            2                    0
4         5             1            4                    0
5         6             1            8                    0
6         7             1            9                    0
7         8             1           10                    0
8         9             1           10                    0
9        10             1           10                    0
10       11             0            0                    0
11       12             0            0                    0
12       13             0            0                    0
13       14             0            0                    0
14       15             0            0                    0
15       16             1            2                    0
16       17             1            4                    0
17       18             1            8                    0
18       19             1           10                    0
19       20             1           10                    0
20       21             1           10                    0
21       22             1           10                    0
22       23             1           10                    0

Новый код:

In [2]:
df['Sensor_Warmup_State'] = (df['Sensor_State'] == 1) &\
(df['Sensor_State'].shift(1) == 1) &\
(df['Sensor_State'].shift(2) == 1) &\
(df['Sensor_State'].shift(3) == 1) &\
(df['Sensor_State'].shift(4) == 1) &\
(df['Sensor_State'].shift(5) == 1)

df['Processed_Temp'] = df['Sensor_Warmup_State'] * df['Temperature']
df

Out[2]: 
    Seconds  Sensor_State  Temperature  Sensor_Warmup_State  Processed_Temp
0         1             0            0                False               0
1         2             0            0                False               0
2         3             1            1                False               0
3         4             1            2                False               0
4         5             1            4                False               0
5         6             1            8                False               0
6         7             1            9                False               0
7         8             1           10                 True              10
8         9             1           10                 True              10
9        10             1           10                 True              10
10       11             0            0                False               0
11       12             0            0                False               0
12       13             0            0                False               0
13       14             0            0                False               0
14       15             0            0                False               0
15       16             1            2                False               0
16       17             1            4                False               0
17       18             1            8                False               0
18       19             1           10                False               0
19       20             1           10                False               0
20       21             1           10                 True              10
21       22             1           10                 True              10
22       23             1           10                 True              10
...