заполнить значения после условия с помощью NaN

#python-3.x #pandas #numpy

#python-3.x #панды #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
  

Я хочу заполнить строки после 2 в столбце val (в примере все значения в столбце 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'])
  

но не могу заставить его заполнить nan вперед.

Комментарии:

1. Пример с хлебом и маслом того, как написать вопрос pandas, молодец.

Ответ №1:

Вы можете использовать boolean indexing with cummax для заполнения 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
  

Ответ №2:

Вы можете попробовать :

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

Ответ №3:

Как только вы получите индекс 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