Как пройтись по 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 шт):
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])
Раз ответ с локатором уже дали, дам ответ с .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