Удаление первого значения после последовательности NaN столбца фрейма данных

#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()