Я думаю, вам нужно только DataFrame.loc[]
+ Series.mean()
:
df.loc[df['gender'].eq('female'), 'admitted'].mean()
True
интерпретируется как 1
и False
как 0
от Series.mean
Вы можете проверить с помощью timeit
%%timeit
df.loc[df['gender'].eq('female'), 'admitted'].mean()
1.16 ms ± 66.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
len(df[(df['gender']=='female') & (df['admitted'])])/(len(df[df['gender']=='female']))
3.45 ms ± 428 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
df.groupby('gender').get_group('female')[df['admitted'] == True].count()/len(df.groupby('gender').get_group('female'))
10.3 ms ± 718 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
len(df.query("gender == 'female' & admitted"))/len(df.query("gender == 'female'"))
11.1 ms ± 604 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Это время для образца DataFrame
Я думаю, что производительность может сильно варьироваться в зависимости от форма вашего DataFrame
. Хотя я искренне верю, что предлагаемый мною метод в большинстве случаев будет самым быстрым, помимо обеспечения простого и понятного синтаксиса.