Как выполнить скользящее окно в pandas DataFrame, при котором каждая строка состоит из значений nan, которые не следует заменять? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть следующий фрейм данных:

df = pd.DataFrame([[0, 1, 2, 4, np.nan, np.nan, np.nan,1],
                 [0, 1, 2 ,np.nan, np.nan, np.nan,np.nan,1],
                 [0, 2, 2 ,np.nan, 2, np.nan,1,1]])

С выходом:

   0  1  2    3    4    5    6  7
0  0  1  2    4  NaN  NaN  NaN  1
1  0  1  2  NaN  NaN  NaN  NaN  1
2  0  2  2  NaN    2  NaN    1  1

с dtypes:

    df.dtypes

0      int64
1      int64
2      int64
3    float64
4    float64
5    float64
6    float64
7      int64

Затем применяется скользящее суммирование снизу:

df.rolling(window = 7, min_periods =1, axis = 'columns').sum()

Результат выглядит следующим образом:

     0    1    2    3    4    5    6    7
0  0.0  1.0  3.0  4.0  4.0  4.0  4.0  4.0
1  0.0  1.0  3.0  NaN  NaN  NaN  NaN  4.0
2  0.0  2.0  4.0  NaN  2.0  2.0  3.0  5.0

Я заметил, что скользящее окно останавливается и запускается снова всякий раз, когда dtype следующего столбца отличается.

Однако у меня есть фрейм данных, в котором все столбцы имеют один и тот же тип object.

df = df.astype('object')

, который имеет вывод:

     0    1    2    3    4    5    6    7
0  0.0  1.0  3.0  7.0  7.0  7.0  7.0  8.0
1  0.0  1.0  3.0  3.0  3.0  3.0  3.0  4.0
2  0.0  2.0  4.0  4.0  6.0  6.0  7.0  8.0

Мой желаемый результат, однако, останавливается и начинается снова после появления значения nan. Это будет выглядеть так:

     0    1    2    3    4    5    6    7
0  0.0  1.0  3.0  7.0  NaN  NaN  NaN  8.0
1  0.0  1.0  3.0  NaN  NaN  NaN  Nan  4.0
2  0.0  2.0  4.0  NaN  6.0  NaN  7.0  8.0

Я подумал, что должен быть способ, при котором значения NaN не учитываются, но и не заполняются значениями, полученными из скользящего окна.

Все может помочь!

1 Ответ

0 голосов
/ 07 августа 2020

Обходной путь:

Где расположены nan-значения:

nan = df.isnull()

Применить скользящее окно.

df = df.rolling(window = 7, min_periods =1, axis = 'columns').sum()

Показывать только значения, помеченные как false.

df[~nan]
...