Мой фрейм данных под названием ozon
с одним столбцом O3
заполнен сотнями рядов со значениями NaN
. Само по себе это не проблема, однако почему-то каждое первое значение после этих рядов выходит за пределы, на много. Например:
O3
Datetime
2019-10-17 21:30:00 NaN
2019-10-17 21:35:00 NaN
2019-10-17 21:40:00 NaN
2019-10-17 21:45:00 NaN
2019-10-17 21:50:00 NaN
2019-10-17 21:55:00 NaN
2019-10-17 22:00:00 NaN
2019-10-17 22:05:00 NaN
2019-10-17 22:10:00 NaN
2019-10-17 22:15:00 NaN
2019-10-17 22:20:00 55.08
2019-10-17 22:25:00 36.25
2019-10-17 22:30:00 36.31
2019-10-17 22:35:00 36.46
2019-10-17 22:40:00 36.51
2019-10-17 22:45:00 36.58
2019-10-17 22:50:00 36.75
2019-10-17 22:55:00 36.71
2019-10-17 23:00:00 36.83
2019-10-17 23:05:00 36.81
На изображении ниже вы также можете это увидеть, возможно, более четко.
Поэтому я хочу удалить первое «реальное» значение после каждой серии значений NaN. Итак, мой желаемый результат в приведенном примере:
O3
Datetime
2019-10-17 21:30:00 NaN
2019-10-17 21:35:00 NaN
2019-10-17 21:40:00 NaN
2019-10-17 21:45:00 NaN
2019-10-17 21:50:00 NaN
2019-10-17 21:55:00 NaN
2019-10-17 22:00:00 NaN
2019-10-17 22:05:00 NaN
2019-10-17 22:10:00 NaN
2019-10-17 22:15:00 NaN
2019-10-17 22:20:00 NaN
2019-10-17 22:25:00 36.25
2019-10-17 22:30:00 36.31
2019-10-17 22:35:00 36.46
2019-10-17 22:40:00 36.51
2019-10-17 22:45:00 36.58
2019-10-17 22:50:00 36.75
2019-10-17 22:55:00 36.71
2019-10-17 23:00:00 36.83
2019-10-17 23:05:00 36.81
Большое спасибо за Вашу помощь!
Я использовал 0 вместо Nans, но применяется то же правило, в моем решении есть несколько шагов, которые вам нужно предпринять, чтобы очистить свой набор данных.
сначала получите все индексы NaN (в данном случае 0)
df = pd.DataFrame({'03': [1, 2, 4, 3, 0, 0, 0, 2, 5, 3, 5, 0, 0, 0, 1, 4, 5, 6, 0, 0, 5, 7]})
print(df)
idxs = df.index[df['03'] == 0].tolist()
print(idxs)
Затем получите все индексы, где разница не равна 1, и добавьте последний элемент массива индексов (поскольку он не будет выбран)
diff_i = [i for i, j in zip(idxs[:-1], idxs[1:]) if j-i!=1]
diff_i.append(idxs[-1])
print(diff_i)
Затем выполните цикл и переназначьте все значения так
for i in diff_i:
df.at[i+1, '03'] = 0
print(df)
который будет идти из кадра данных
03
0 1
1 2
2 4
3 3
4 0
5 0
6 0
7 2
8 5
9 3
10 5
11 0
12 0
13 0
14 1
15 4
16 5
17 6
18 0
19 0
20 5
21 7
к фрейму данных
03
0 1
1 2
2 4
3 3
4 0
5 0
6 0
7 0
8 5
9 3
10 5
11 0
12 0
13 0
14 0
15 4
16 5
17 6
18 0
19 0
20 0
21 7
возможно, вам придется использовать idxs = df.index[df['03'] == np.nan].tolist()
shift для проверки строки prv и isnull для проверки NaN что вам нужно, как показано ниже:
Код:
import pandas as pd
import numpy as np
df = pd.read_csv('data.csv', delimiter=',')
print(df)
df['O3'] = np.where(df['O3'].shift(1).isnull(), np.nan, df['O3'])
print(df)
Выход:
Datetime O3
0 2019-10-17 21:30:00 NaN
1 2019-10-17 21:35:00 NaN
2 2019-10-17 21:40:00 NaN
3 2019-10-17 21:45:00 NaN
4 2019-10-17 21:50:00 NaN
5 2019-10-17 21:55:00 NaN
6 2019-10-17 22:00:00 NaN
7 2019-10-17 22:05:00 NaN
8 2019-10-17 22:10:00 NaN
9 2019-10-17 22:15:00 NaN
10 2019-10-17 22:20:00 55.08
11 2019-10-17 22:25:00 36.25
12 2019-10-17 22:30:00 36.31
13 2019-10-17 22:35:00 36.46
14 2019-10-17 22:40:00 36.51
15 2019-10-17 22:45:00 36.58
16 2019-10-17 22:50:00 36.75
17 2019-10-17 22:55:00 36.71
18 2019-10-17 23:00:00 36.83
19 2019-10-17 23:05:00 36.81
Datetime O3
0 2019-10-17 21:30:00 NaN
1 2019-10-17 21:35:00 NaN
2 2019-10-17 21:40:00 NaN
3 2019-10-17 21:45:00 NaN
4 2019-10-17 21:50:00 NaN
5 2019-10-17 21:55:00 NaN
6 2019-10-17 22:00:00 NaN
7 2019-10-17 22:05:00 NaN
8 2019-10-17 22:10:00 NaN
9 2019-10-17 22:15:00 NaN
10 2019-10-17 22:20:00 NaN
11 2019-10-17 22:25:00 36.25
12 2019-10-17 22:30:00 36.31
13 2019-10-17 22:35:00 36.46
14 2019-10-17 22:40:00 36.51
15 2019-10-17 22:45:00 36.58
16 2019-10-17 22:50:00 36.75
17 2019-10-17 22:55:00 36.71
18 2019-10-17 23:00:00 36.83
19 2019-10-17 23:05:00 36.81
Да! Это сработало очень хорошо! Большое спасибо!
По какой-то причине это не сработало, так как список idxs по-прежнему пуст после: idxs = df.index[df['03'] == 'NaN'].tolist()