Skip to main content
 首页 » 编程设计

python之Pandas 根据上面的行向下填充缺失值

2025年05月04日15luoye11

我有一个如下所示的数据框:

import pandas as pd 
data={'col1':[1,3,3,1,2,3,2,2, 1], 'col2':[np.nan, 1, np.nan, 1, np.nan, np.nan, np.nan, 2, np.nan]} 
df=pd.DataFrame(data,columns=['col1', 'col2']) 
print df 
 
   col1  col2 
0     1   NaN 
1     3   1.0 
2     3   NaN 
3     1   1.0 
4     2   NaN 
5     3   NaN 
6     2   NaN 
7     2   2.0 
8     1   NaN 

如果 col2 的值等于 1.0 或col2 中的上一行是 1.0。最终的数据框如下所示:

 col1  col2  col3 
0     1   NaN   NaN 
1     3   1.0   1.0 
2     3   NaN   1.0 
3     1   1.0   1.0 
4     2   NaN   1.0 
5     3   NaN   1.0 
6     2   NaN   1.0 
7     2   2.0   2.0 
8     1   NaN   NaN 

我尝试的第一种方法是:

df['col3'] = ((df['col2']== 1) | ((df['col2'].shift()== 1))).astype('int' )

这给我留下了这个数据框:

col1  col2  col3 
0     1   NaN     0 
1     3   1.0     1 
2     3   NaN     1 
3     1   1.0     1 
4     2   NaN     1 
5     3   NaN     0 
6     2   NaN     0 
7     2   2.0     0 
8     1   NaN     0 

它纠正了缺失值的第一个实例,但不会继续填充缺失值。我还尝试使用 np.where() 函数,我得到了相同的结果。

有没有一种方法可以在 pandas 中写这个,它可以连续修复多个实例?

请您参考如下方法:

您可以使用 np.where通过查看 forward-fill 等于 1 的位置,在为 True 的位置填充 1,并在为 False 时回退到 'col2' 的值:

df['col2'] = np.where(df['col2'].ffill() == 1, 1, df['col2']) 

结果输出:

   col1  col2 
0     1   NaN 
1     3   1.0 
2     3   1.0 
3     1   1.0 
4     2   1.0 
5     3   1.0 
6     2   1.0 
7     2   2.0 
8     1   NaN