我试图转发填充特定的列,但仅在行等于特定值的地方填充。例如,使用下面的df,我要.ffill()Val1,Val2,Helper,其中Helper中的行='Forward'。其他所有内容都应该保持不变。
df = pd.DataFrame({
'Col' : ['X',np.nan,np.nan,'Y',np.nan,'Z',np.nan,np.nan,np.nan],
'Val1' : ['B',np.nan,np.nan,'A',np.nan,'C',np.nan,np.nan,np.nan],
'Val2' : ['A',np.nan,np.nan,'C',np.nan,'C',np.nan,np.nan,np.nan],
'Helper' : ['No',np.nan,np.nan,'Forward',np.nan,'Held',np.nan,np.nan,np.nan],
})
mask = df['Helper'].str.contains('Forward', na = True)
df.loc[mask, 'Val1'] = df['Val1']
df['Val1'] = df['Val1'].ffill()
df.loc[mask, 'Val1'] = np.nan
预期输出:
Col Val1 Val2 Helper
0 X B A No
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 Y A C Forward
4 NaN A C Forward
5 Z C C Held
6 NaN NaN NaN NaN
7 NaN NaN NaN NaN
8 NaN NaN NaN NaN
答案 0 :(得分:2)
尝试一下
df.update(df.loc[df['Helper'].str.contains('Forward').ffill(), ['Val1','Val2','Helper']].ffill())
输出
print(df)
Col Val1 Val2 Helper
0 X B A No
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 Y A C Forward
4 NaN A C Forward
5 Z C C Held
6 NaN NaN NaN NaN
7 NaN NaN NaN NaN
8 NaN NaN NaN NaN
答案 1 :(得分:1)
在向前填充后创建一个遮罩,然后使用条件使用np.where
>>> m = df['Helper'].ffill().str.contains('Forward')
>>> req_cols = ['Val1', 'Val2', 'Helper']
>>> df[cols] = np.where(m, df[cols].ffill(), df[cols])
>>> df
Col Val1 Val2 Helper
0 X B A No
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 Y A C Forward
4 NaN A C Forward
5 Z C C Held
6 NaN NaN NaN NaN
7 NaN NaN NaN NaN
8 NaN NaN NaN NaN