Pandas: проверка NaN с использованием функции прокрутки

У меня есть кадр данных с переменной «A», и я хотел бы создать скользящую проверку Nan, чтобы новая переменная «rolling_nan» = 1, если ВСЕ 3 (секунды) ячейки (текущая ячейка и две предыдущие) являются NaN , иначе "rolling_nan" = 0.

Я применяю функцию, так как функция .rolling pandas не поддерживает isna(). Однако я получаю следующее. Также я не уверен, как включить одно и то же значение строки в средство проверки NaN.

import pandas as pd
import numpy as np

idx = pd.date_range('2018-01-01', periods=10, freq='S')
df = pd.DataFrame({"A":[1,2,3,np.nan,np.nan,np.nan,6,7,8,9]}, index = idx)
df

def isna_func(x):
    return 1 if pd.isna(x).all() == True else 0
df['rolling_nan'] = df['A'].rolling(3).apply(isna_func)
df

                    A   rolling_nan
2018-01-01 00:00:00 1.0 NaN
2018-01-01 00:00:01 2.0 NaN
2018-01-01 00:00:02 3.0 0.0
2018-01-01 00:00:03 NaN NaN
2018-01-01 00:00:04 NaN NaN
2018-01-01 00:00:05 NaN NaN
2018-01-01 00:00:06 6.0 NaN
2018-01-01 00:00:07 7.0 NaN
2018-01-01 00:00:08 8.0 0.0
2018-01-01 00:00:09 9.0 0.0

В приведенном выше примере rolling_nan должно быть равно 1 только в отметке времени 2018-01-01 00:00:05 и 0 в противном случае.


person finstats    schedule 27.03.2019    source источник


Ответы (1)


Вы можете думать по-другому, отметьте все notna и найдите max

df.A.notna().rolling(3).max()==0
Out[316]: 
2018-01-01 00:00:00    False
2018-01-01 00:00:01    False
2018-01-01 00:00:02    False
2018-01-01 00:00:03    False
2018-01-01 00:00:04    False
2018-01-01 00:00:05     True
2018-01-01 00:00:06    False
2018-01-01 00:00:07    False
2018-01-01 00:00:08    False
2018-01-01 00:00:09    False
Freq: S, Name: A, dtype: bool

Назначить его обратно

df['rollingnan']=(df.A.notna().rolling(3).max()==0).astype(int)
df
Out[320]: 
                       A  rollingnan
2018-01-01 00:00:00  1.0           0
2018-01-01 00:00:01  2.0           0
2018-01-01 00:00:02  3.0           0
2018-01-01 00:00:03  NaN           0
2018-01-01 00:00:04  NaN           0
2018-01-01 00:00:05  NaN           1
2018-01-01 00:00:06  6.0           0
2018-01-01 00:00:07  7.0           0
2018-01-01 00:00:08  8.0           0
2018-01-01 00:00:09  9.0           0

Или основывайтесь на своей идее, используя all

df['A'].isna().rolling(3).apply(lambda x : x.all(),raw=True)
Out[323]: 
2018-01-01 00:00:00    NaN
2018-01-01 00:00:01    NaN
2018-01-01 00:00:02    0.0
2018-01-01 00:00:03    0.0
2018-01-01 00:00:04    0.0
2018-01-01 00:00:05    1.0
2018-01-01 00:00:06    0.0
2018-01-01 00:00:07    0.0
2018-01-01 00:00:08    0.0
2018-01-01 00:00:09    0.0
Freq: S, Name: A, dtype: float64
person BENY    schedule 27.03.2019
comment
Спасибо за ваш ответ. В случае, если я хотел создать столбец с последним не-NaN в функции прокрутки, как я могу настроить функцию, так как функция прокрутки также не поддерживает .last(). Таким образом, используя приведенный выше пример, новый столбец будет отображать в 2018-01-01 00:00:03 и 2018-01-01 00:00:04 последнее допустимое значение, которое равно 3, а в 2018-01-01 00:00:05 будет NaN. - person finstats; 27.03.2019
comment
@roland stackoverflow.com/questions /40101130/ - person BENY; 27.03.2019
comment
В предоставленной вами ссылке они ищут максимальное значение. В моем случае я был последним значением, которое может не быть максимальным значением. - person finstats; 28.03.2019