我有一个如下数据框:
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
的值等于col2
或1.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中写这个,它可以连续修复多个实例?
答案 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