#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