Python 如果行值等于x,则向前填充列

Python 如果行值等于x,则向前填充列,python,pandas,Python,Pandas,我试图向前填充特定的列,但仅当一行等于某个值时。例如,使用下面的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.n

我试图向前填充特定的列,但仅当一行等于某个值时。例如,使用下面的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
试试这个

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

在正向填充后创建掩码,然后使用条件使用
np填充列。其中

>>> 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

谢谢@moys。非常干净的回答。甚至不知道
update