根据行的先前值填充NaN

时间:2019-08-27 13:07:33

标签: python pandas

我有一个数据框(样本,不是真实的):

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  

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:12)

Idea调整了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

详细信息

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