用NaN填充条件后的值

时间:2020-09-23 09:38:16

标签: python-3.x pandas numpy

我有这样的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

打印:

    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

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

我尝试过:

df['val'] = np.where(df['val'].shift(-1) == 2, np.nan, df['val'])

并像这样遍历行:

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

但无法让它向前填补。

3 个答案:

答案 0 :(得分:6)

您可以将boolean indexingcummax一起使用,以填充nan的值:

df.loc[df['val'].eq(2).cummax(), 'val'] = np.nan

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

df['val'] = df['val'].mask(lambda x: x.eq(2).cummax())

  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

答案 1 :(得分:2)

您可以尝试:

ind = df.loc[df['val']==2].index
df.iloc[ind[0]:,1] = np.nan

答案 2 :(得分:0)

一旦获得df.index[df.val.shift(-1).eq(2)].item()的索引,就可以使用切片

idx = df.index[df.val.shift(-1).eq(2)].item()
df.iloc[idx:, 1] = np.nan
df
  key  val
0   A  1.0
1   A  1.0
2   A  NaN
3   B  NaN
4   B  NaN
5   A  NaN
6   A  NaN
7   B  NaN
8   B  NaN
相关问题