用 NaN 填充条件后的值

NRV*_*RVA 5 numpy python-3.x pandas

我有一个这样的 df:

df = pd.DataFrame(
    [
        ['A', 1],
        ['A', 1],
        ['A', 1],
        ['B', 2],
        ['B', 0],
        ['A', 0],
        ['A', 1],
        ['B', 1],
        ['B', 0]
    ], columns = ['key', 'val'])
df
Run Code Online (Sandbox Code Playgroud)

打印:

    key val
0   A   1
1   A   1
2   A   1
3   B   2
4   B   0
5   A   0
6   A   1
7   B   1
8   B   0
Run Code Online (Sandbox Code Playgroud)

我想填充 val 列中 2 之后的行(在示例中,val 列中从第 3 行到第 8 行的所有值都替换为 nan)。

我试过这个:

df['val'] = np.where(df['val'].shift(-1) == 2, np.nan, df['val'])
Run Code Online (Sandbox Code Playgroud)

并像这样迭代行:

for row in df.iterrows():
    df['val'] = np.where(df['val'].shift(-1) == 2, np.nan, df['val'])
Run Code Online (Sandbox Code Playgroud)

但无法让它向前填充nan。

Shu*_*rma 6

您可以使用boolean indexingwithcummax来填充nan值:

df.loc[df['val'].eq(2).cummax(), 'val'] = np.nan
Run Code Online (Sandbox Code Playgroud)

或者,您也可以使用Series.mask

df['val'] = df['val'].mask(lambda x: x.eq(2).cummax())
Run Code Online (Sandbox Code Playgroud)
  key  val
0   A  1.0
1   A  1.0
2   A  1.0
3   B  NaN
4   B  NaN
5   A  NaN
6   A  NaN
7   B  NaN
8   B  NaN
Run Code Online (Sandbox Code Playgroud)