Ниже представлен игрушечный фрейм данных Pandas с тремя столбцами: «id» (идентификатор группы), «b» (для условия) и «c» (цель):
df = pd.DataFrame({'id' : [1,1,1,1,1,1,1,2,2,2,2,2,2,2],
'b' : [3,4,5,'A',3,4,'A',1,'A',1,3,'A',2,3],
'c' : [1,0,1,10,1,1,20,1,10,0,1,20,1,1]})
print(df)
id b c
0 1 3 1
1 1 4 0
2 1 5 1
3 1 A 10
4 1 3 1
5 1 4 1
6 1 A 20
7 2 1 1
8 2 A 10
9 2 1 0
10 2 3 1
11 2 A 20
12 2 2 1
13 2 3 1
Для каждой группы я хочу заменить значения в столбце «c» на nan (т. е. np.nan
) до первого появления «A» в столбце «b».
Желаемый результат следующий:
desired_output_df = pd.DataFrame({'id' : [1,1,1,1,1,1,1,2,2,2,2,2,2,2],
'b' : [3,4,5,'A',3,4,'A',1,'A',1,3,'A',2,3],
'c' : [np.nan,np.nan,np.nan,10,1,1,20,np.nan,10,0,1,20,1,1]})
print(desired_output_df)
id b c
0 1 3 NaN
1 1 4 NaN
2 1 5 NaN
3 1 A 10.0
4 1 3 1.0
5 1 4 1.0
6 1 A 20.0
7 2 1 NaN
8 2 A 10.0
9 2 1 0.0
10 2 3 1.0
11 2 A 20.0
12 2 2 1.0
13 2 3 1.0
Я могу получить индекс значений столбца c, которые я хочу изменить, с помощью следующей команды: df.groupby('id').apply(lambda x: x.loc[:(x.b == 'A').idxmax()-1]).index
. Но результатом является «MultiIndex», и я не могу использовать его для замены значений.
MultiIndex([(1, 0),
(1, 1),
(1, 2),
(2, 7)],
names=['id', None])
Заранее спасибо.
В группе с id = 2 строка 7 представляет экземпляр до первого вхождения «A» в столбце b.
Ох, хорошо! Я пропустил часть «для каждой группы».
Пытаться:
df['c'] = np.where(df.groupby('id').apply(lambda x: x['b'].eq('A').cumsum()) > 0, df['c'], np.nan)
print(df)
Отпечатки:
id b c
0 1 3 NaN
1 1 4 NaN
2 1 5 NaN
3 1 A 10.0
4 1 3 1.0
5 1 4 1.0
6 1 A 20.0
7 2 1 NaN
8 2 A 10.0
9 2 1 0.0
10 2 3 1.0
11 2 A 20.0
12 2 2 1.0
13 2 3 1.0
Ваш пример, кажется, противоречит вашему описанию. Почему
c
строки 7 являетсяNaN
в желаемом результате?