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

时间:2019-11-13 03:39:07

标签: 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.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

2 个答案:

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