基于上面的行,熊猫填补缺失值

时间:2017-02-24 20:21:34

标签: python pandas

我有一个如下数据框:

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的值等于col21.0中的上一行,我正在尝试制作填充col2中的NaN值的第三列是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中写这个,它可以连续修复多个实例?

3 个答案:

答案 0 :(得分:6)

你可以通过查看前向填充等于1的位置来使用np.where,填充1为真的位置,并且当它为假时回落到'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

答案 1 :(得分:2)

ffilled = df.col2.ffill()
df.assign(col3=df.col2.fillna(ffilled[ffilled == 1]))

答案 2 :(得分:0)

你可以像这样使用 df.fillna 函数和正向填充:

df.fillna(method='pad')

   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   2.0