Заполнить NaN на основе предыдущего значения строки
У меня есть фрейм данных (образец, не реальный):
df =
A B C D E F
0 3 4 NaN NaN NaN NaN
1 9 8 NaN NaN NaN NaN
2 5 9 4 7 NaN NaN
3 5 7 6 3 NaN NaN
4 2 6 4 3 NaN NaN
Теперь я хочу заполнить значения NaN предыдущими парами (!!!) значений строки (заполнить Nan оставленной существующей парой чисел и применить ко всей строке) и применить это ко всему набору данных.
- Есть много ответов относительно заполнения столбцов. Но в
этот случай мне нужно заполнить на основе строк.
- Есть также ответы, связанные с заполнением NaN на основе других столбцов, но
в моем случае количество столбцов больше 2000. Это пример данных
Желаемый результат:
df =
A B C D E F
0 3 4 3 4 3 4
1 9 8 9 8 9 8
2 5 9 4 7 4 7
3 5 7 6 3 6 3
4 2 6 4 3 4 3
Ответы
Ответ 1
IIUC, быстрое решение без изменения данных:
df.iloc[:,::2] = df.iloc[:,::2].ffill(1)
df.iloc[:,1::2] = df.iloc[:,1::2].ffill(1)
df
Выход:
A B C D E F
0 3 4 3 4 3 4
1 9 8 9 8 9 8
2 5 9 4 7 4 7
3 5 7 6 3 6 3
4 2 6 4 3 4 3
Ответ 2
Идея заключается в изменении формы DataFrame для возможного прямого и обратного заполнения недостающих значений с помощью stack
и деления по модулю и целому числу 2
массива на длину столбцов:
c = df.columns
a = np.arange(len(df.columns))
df.columns = [a // 2, a % 2]
#if possible some pairs missing remove .astype(int)
df1 = df.stack().ffill(axis=1).bfill(axis=1).unstack().astype(int)
df1.columns = c
print (df1)
A B C D E F
0 3 4 3 4 3 4
1 9 8 9 8 9 8
2 5 9 4 7 4 7
3 5 7 6 3 6 3
4 2 6 4 3 4 3
Detail:
print (df.stack())
0 1 2
0 0 3 NaN NaN
1 4 NaN NaN
1 0 9 NaN NaN
1 8 NaN NaN
2 0 5 4.0 NaN
1 9 7.0 NaN
3 0 5 6.0 NaN
1 7 3.0 NaN
4 0 2 4.0 NaN
1 6 3.0 NaN