Код: Выделить всё
Time Value Flag
0 00:30 5 0
1 01:00 5 0
2 00:30 10 0
3 01:00 10 1
4 00:30 15 0
5 01:00 15 1
6 00:30 20 1
7 01:00 20 0
8 00:30 25 1
9 01:00 25 0
10 00:30 30 1
11 01:00 30 0
Результирующий кадр данных должен быть равен приведенному ниже:
Код: Выделить всё
Time Value Flag Result
0 00:30 5 0 n/a
1 01:00 5 0 n/a
2 00:30 10 0 n/a
3 01:00 10 1 n/a
4 00:30 15 0 7,5
5 01:00 15 1 n/a
6 00:30 20 1 12,5
7 01:00 20 0 n/a
8 00:30 25 1 12,5
9 01:00 25 0 12,5
10 00:30 30 1 12,5
11 01:00 30 0 22,5
- Результат в строке 8 = среднее значение строки 4 и строки 2 [(15+ 10)/2] = 12,5. Т.е. он использует два последних значения для 00:30, исключая значение из строки 6 из ретроспективного анализа.
- Результат в строке 4 = среднее значение строки 2 и строки 0 [(10+ 5)/2] = 7,5. Т.е. он использует два последних значения для 00:30 без значений, где df['Flag'] == 1.
Код: Выделить всё
import pandas as pd
#DataFrame
data = {
'Time': ['00:30', '01:00', '00:30', '01:00', '00:30', '01:00', '00:30', '01:00', '00:30', '01:00', '00:30', '01:00'],
'Value': [5, 5, 10, 10, 15, 15, 20, 20, 25, 25, 30, 30],
'Flag': [0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0]
}
df = pd.DataFrame(data)
- Функция
Код: Выделить всё
def calculate_rolling_avg(df):
values = df.loc[df['Flag'] == 0, 'Value']
rolling_avg = values.shift(1).rolling(window=2).mean()
return rolling_avg
- Примените функцию и создайте столбец «Результат».
Код: Выделить всё
df['Result'] = df.index.to_series().map(calculate_rolling_avg(df))
print(df)
Код: Выделить всё
Time Value Flag Result
0 00:30 5 0 NaN
1 01:00 5 0 NaN
2 00:30 10 0 5.0
3 01:00 10 1 NaN
4 00:30 15 0 7.5
5 01:00 15 1 NaN
6 00:30 20 1 NaN
7 01:00 20 0 12.5
8 00:30 25 1 NaN
9 01:00 25 0 17.5
10 00:30 30 1 NaN
11 01:00 30 0 22.5
Подробнее здесь: https://stackoverflow.com/questions/787 ... agged-data