#python #dataframe
#python #фрейм данных
Вопрос:
Мой фрейм данных, вызываемый 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
Большое вам спасибо за вашу помощь!
Ответ №1:
сдвиг для проверки строки 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
Комментарии:
1. Да! Это сработало действительно хорошо! Большое вам спасибо!
Ответ №2:
Я использовал 0 вместо Nan, но применяется то же правило, в моем решении есть несколько шагов, которые вам нужно предпринять, чтобы иметь возможность очистить ваш набор данных
сначала получите все индексы 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
Комментарии:
1. По какой-то причине это не сработало, так как список idxs по-прежнему пуст после: idxs = df.index[df[’03’] == ‘NaN’].tolist()
2. возможно, вам придется использовать
idxs = df.index[df['03'] == np.nan].tolist()