Как заморозить первые числа в последовательностях между NaN в Python pandas dataframe - PullRequest
1 голос
/ 03 апреля 2020

Есть ли способ Pythoni c для того, чтобы в кадре данных временных рядов, по столбцу, go вниз и выбрать первое число в последовательности, а затем pu sh переслать его до следующего NaN, а затем принять следующее число, отличное от NaN, и pu sh, то есть до следующего NaN, и т. д. (сохранение индексов и NaN).

Например, я хотел бы преобразовать этот кадр данных:

DF = pd.DataFrame(data={'A':[np.nan,1,3,5,7,np.nan,2,4,6,np.nan], 'B':[8,6,4,np.nan,np.nan,9,7,3,np.nan,3], 'C':[np.nan,np.nan,4,2,6,np.nan,1,5,2,8]})
     A    B    C
0  NaN  8.0  NaN
1  1.0  6.0  NaN
2  3.0  4.0  4.0
3  5.0  NaN  2.0
4  7.0  NaN  6.0
5  NaN  9.0  NaN
6  2.0  7.0  1.0
7  4.0  3.0  5.0
8  6.0  NaN  2.0
9  NaN  3.0  8.0

К этому фрейму данных:

Result = pd.DataFrame(data={'A':[np.nan,1,1,1,1,np.nan,2,2,2,np.nan], 'B':[8,8,8,np.nan,np.nan,9,9,9,np.nan,3], 'C':[np.nan,np.nan,4,4,4,np.nan,1,1,1,1]})
     A    B    C
0  NaN  8.0  NaN
1  1.0  8.0  NaN
2  1.0  8.0  4.0
3  1.0  NaN  4.0
4  1.0  NaN  4.0
5  NaN  9.0  NaN
6  2.0  9.0  1.0
7  2.0  9.0  1.0
8  2.0  NaN  1.0
9  NaN  3.0  1.0

Я знаю, что могу использовать al oop, чтобы перебрать столбцы, чтобы сделать это, но был бы признателен за помощь в том, как сделать это более эффективным способом Pythoni c на очень большом фрейме данных. Спасибо.

1 Ответ

0 голосов
/ 03 апреля 2020

IIU C:

# where DF is not NaN
mask = DF.notna()
Result = (DF.shift(-1)           # fill the original NaN's with their next value
            .mask(mask)          # replace all the original non-NaN with NaN
            .ffill()             # forward fill 
            .fillna(DF.iloc[0])  # starting of the the columns with a non-NaN
            .where(mask)         # replace the original NaN's back
         )

Выход:

     A    B    C
0  NaN  8.0  NaN
1  1.0  8.0  NaN
2  1.0  8.0  4.0
3  1.0  NaN  4.0
4  1.0  NaN  4.0
5  NaN  9.0  NaN
6  2.0  9.0  1.0
7  2.0  9.0  1.0
8  2.0  NaN  1.0
9  NaN  3.0  1.0
...