Pandas выдает предупреждение. Как это исправить?
Код
passed = df[df['math score'] >= passmark]
passe = int(passed['math score'].count())
al = int(df['math score'].count())
passed_course = df[df['test preparation'] == 'completed'][df['gender'] == 'female'][df['math score'] >= passmark].groupby('gender')['gender']
no_course = df[df['test preparation'] != 'completed'][df['gender'] == 'female'][df['math score'] < passmark].groupby('gender')['gender']
print(f'Доля студентов сдавших экзамен по математике - \n{(passe/al)}\n')
print(f'Доля женщин проходивших курс и сдавших экзамен - \n{(passed_course.count()/al)}\n')
print(f'Доля женщин не проходивших курс и не сдавших экзамен - \n{(no_course.count()/al)}\n')
Предупреждение
C:\Users\Oskarr\AppData\Local\Temp/ipykernel_9044/835242634.py:6: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
passed_course = df[df['test preparation'] == 'completed'][df['gender'] == 'female'][df['math score'] >= passmark].groupby('gender')['gender']
C:\Users\Oskarr\AppData\Local\Temp/ipykernel_9044/835242634.py:8: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
no_course = df[df['test preparation'] != 'completed'][df['gender'] == 'female'][df['math score'] < passmark].groupby('gender')['gender']
Ответы (1 шт):
Если вы хотите применить к датафрейму сразу несколько условий, то делать это нужно так, объединив маски "логическим and" (и обязательно взять условия в скобки, так нужно):
passed_course = df.loc[(df['test preparation'] == 'completed')&(df['gender'] == 'female')&(df['math score'] >= passmark)]
Т.е. выборку нужно производить по объединённой маске условия. У вас же получается цепочка выборок и пандас не уверен, что вы от него хотите, когда берёте по булевой маске датафрейма выборку из подвыборки этого датафрейма.
Ну то есть если посмотреть по шагам, то в выборке df[df['test preparation'] == 'completed'] уже просто может быть меньше строк, чем в df, а вы пытаетесь из неё сделать выборку по булевой маске df['gender'] == 'female', которая будет иметь столько строк, сколько их было в исходном датафрейме. И для пандас это выглядит проблемой - булевая маска больше, чем число строк датафрейма, к которому она применяется. Да, по индексу их всё ещё можно сопоставить и выкинуть из маски те элементы, которых нет в индексе датафрейма, но выглядит это для пандаса подозрительно, о чём он и предупреждает.