Панды: прямое заполнение без заполняющих конечных NaN - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть датафрейм, где каждый столбец - это временной ряд различной длины. Таким образом, отсутствуют значения как между значениями во временном ряду, так и в конце каждого временного ряда сохраняются один столбец. Я хотел бы заполнить пропущенные значения между значениями, но не заполнить "конечные" NaNs

Использование df = df.fillna(method='ffill') дает мне большую часть пути, но заполняет концевые NaN, что мне не нужно, потому что то, где заканчиваются данные, действительно важно для моего анализа.

Edit:

Я бы хотел включить это:

            ERICB SS Equity  DCI US Equity  FLEX US Equity
date

2008-02-14            8.026            NaN             NaN
2008-02-18              NaN            NaN           1.472
2008-02-19            8.074            NaN             NaN
2008-02-22              NaN            NaN           1.532
2008-02-25            8.062            NaN             NaN
2008-03-03            8.100            NaN             NaN
2008-03-06            8.100            NaN           1.955
2008-03-07            8.100            NaN             NaN
2010-12-30            5.431            NaN             NaN
2010-12-31            5.422            NaN             NaN
2011-01-03            5.422            NaN             NaN
2011-01-04            5.373            NaN             NaN

В это:

            ERICB SS Equity  DCI US Equity  FLEX US Equity
date

2008-02-14            8.026            NaN             NaN
2008-02-18            8.026            NaN           1.472
2008-02-19            8.074            NaN           1.472
2008-02-22            8.074            NaN           1.532
2008-02-25            8.062            NaN           1.532
2008-03-03            8.100            NaN           1.532
2008-03-06            8.100            NaN           1.955
2008-03-07            8.100            NaN             NaN
2010-12-30            5.431            NaN             NaN
2010-12-31            5.422            NaN             NaN
2011-01-03            5.422            NaN             NaN
2011-01-04            5.373            NaN             NaN

Таким образом, он заполняется вперед, но только когда в будущем будет какое-то ненулевое значение для заполнения, оставляя завершающие нули.

1 Ответ

0 голосов
/ 11 сентября 2018

Одним из способов будет bfill, который делает все до последнего значения, отличного от NaN, не-NaN, а затем используйте where для выбора результатов ffill ():

In [45]: df.ffill().where(df.bfill().notnull())
Out[45]: 
          date  ERICB SS Equity  DCI US Equity  FLEX US Equity
0   2008-02-14            8.026            NaN             NaN
1   2008-02-18            8.026            NaN           1.472
2   2008-02-19            8.074            NaN           1.472
3   2008-02-22            8.074            NaN           1.532
4   2008-02-25            8.062            NaN           1.532
5   2008-03-03            8.100            NaN           1.532
6   2008-03-06            8.100            NaN           1.955
7   2008-03-07            8.100            NaN             NaN
8   2010-12-30            5.431            NaN             NaN
9   2010-12-31            5.422            NaN             NaN
10  2011-01-03            5.422            NaN             NaN
11  2011-01-04            5.373            NaN             NaN

Другой вариант будетнапрямую создать маску, содержащую True для всех значений вплоть до последнего действительного значения:

df.ffill().where(df.notnull().iloc[::-1].cummax().iloc[::-1])

, где требуется материал .iloc[::-1], потому что я не могу найти лучший способ выполнения кумулятивной операциив направлении снизу вверх.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...