Как пройтись по DataFrame и подсчитать количество строк, удовлетворяющих сразу нескольким условиям, используя Python?

Таблица, по которой нужно создать DataFrame Надо открыть файл, перенести его содержимое в pandas.DataFrame. Из терминала принимается целое число N. Надо посчитать количество выживших ['Survived'] пассажиров первого класса [Pclass], возраст ['Age'] строго меньше N.

Я попробовал

import pandas as pd
import numpy as np
StAge = int(input())
df = pd.read_csv('titanic.csv')
counter = 0
for c in df.columns:
    for i in df.index:
        if df['Survived'[i]] == 1 and df['Pclass'[i]] == 1 and df['Age'[i]] < StAge:
            counter += 1
print(counter)

При вводе в терминал числа 18 в ответе должно было выйти 11, однако счётчик не срабатывал и выходило 0.


Ответы (3 шт):

Автор решения: Oopss
import pandas as pd
import numpy as np
StAge = 18
df = pd.read_csv('titanic.csv')
df_Survived = df.loc[(df['Survived'] == 1) & (df['age'] < StAge) & (df['Pclass'] == 1)]
print(df_Survived.shape[0])
→ Ссылка
Автор решения: Alexey Trukhanov

Раз ответ с локатором уже дали, дам ответ с .query.

import pandas as pd

df = pd.read_csv('titanic.csv')
StAge = int(input())

df_filtered = df.query('Survived and Pclass == 1 and Age < @StAge')

print(len(df_filtered))

Ну и традиционный совет: если Вы собираетесь применить циклы в работе с pandas, то скорее всего этого делать не стоит.

PS

В решении с локатором можно убрать сам локатор и сравнение выживших с единицей.

df_filtered = df[df['Survived'] & (df['Age'] < StAge) & (df['Pclass'] == 1)]

PPS

Справедливости ради: решение с индексацией на порядок быстрее, чем решение с .query

→ Ссылка
Автор решения: Алексей Р

Читаем, формируем булев массив по условиям и суммируем.

N = 18
df = pd.read_csv(r'c:\test\titanic.csv')
cnt = (df.Survived.eq(1) & df.Pclass.eq(1) & df.Age.lt(N)).sum()
print(cnt)
11
→ Ссылка