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

Мой фрейм данных под названием 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

Большое спасибо за Вашу помощь!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я использовал 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 по-прежнему пуст после: idxs = df.index[df['03'] == 'NaN'].tolist()

Tijmen Stronks 15.12.2020 13:01

возможно, вам придется использовать idxs = df.index[df['03'] == np.nan].tolist()

Norton409 15.12.2020 22:50
Ответ принят как подходящий

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

Да! Это сработало очень хорошо! Большое спасибо!

Tijmen Stronks 15.12.2020 12:58

Другие вопросы по теме