用NaN填充条件后的值



我有一个如下的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'])

但无法让它填补南的前锋。

您可以使用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

您可以尝试:

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

一旦通过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

最新更新