Подтвердить что ты не робот

Заполнить 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  
4b9b3361

Ответ 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