Как сложить условия в DataFrame

Создал игрушечный DateFrame. Хочу решить проблему с условиями, а трактуется вот так:

  • вывести всех, кто старше 40
  • вывести всех, кто имеет доход выше среднего по датасету
  • вывести всех, кто имеет доход выше среднего по датасету, но надежность ниже среднего по датасету

Ну так я это сделал.

import numpy as np
import pandas as pd
'имя': ['Петя', 'Вася', 'Аня', 'Света'],
'возраст': [45, 26, 41 , 21],
'доход': [100000, 80000, 150000, 60000],
'надежность клиента (0..1)': [0.65, 0.74, 0.87, 0.68],
'пол': ['муж', 'муж', 'жен', 'жен']},
index=[0, 1, 2, 3])

print(df[df['возраст'] > 40])
print(df[df['доход'] > df.iloc[:, 2].mean() ])                  #вот тут и есть проблема
print(df[df['надежность клиента (0..1)'] < df.iloc[:, 3].mean()])   


df.head()

                                                       

Как сделать так чтобы все эти 3 условия выходили в одну табличку?


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

Автор решения: CrazyElf

Можно, например, запомнить битовые маски в переменных и потом комбинировать их через логическое и, чтобы не повторять условия:

import numpy as np
import pandas as pd

df = pd.DataFrame({
'имя': ['Петя', 'Вася', 'Аня', 'Света'],
'возраст': [45, 26, 41 , 21],
'доход': [100000, 80000, 150000, 60000],
'надежность клиента (0..1)': [0.65, 0.74, 0.87, 0.68],
'пол': ['муж', 'муж', 'жен', 'жен']},
index=[0, 1, 2, 3])

age_above_40 = df['возраст'] > 40
print(df[age_above_40])

income_above_mean = df['доход'] > df['доход'].mean()
print(df[income_above_mean])

reliability_below_mean = df['надежность клиента (0..1)'] < df['надежность клиента (0..1)'].mean()
print(df[income_above_mean & reliability_below_mean])     

choosen = pd.DataFrame({
    'показатель': ['старше 40', 'имеет доход выше среднего', 'имеет доход выше среднего, но надежность ниже среднего'],
    'имена': [df.loc[age_above_40, 'имя'].to_list(),
              df.loc[income_above_mean, 'имя'].to_list(), 
              df.loc[income_above_mean & reliability_below_mean, 'имя'].to_list()]
})

Содержимое choosen:

                                          показатель    имена
0   старше 40                                           [Петя, Аня]
1   имеет доход выше среднего                           [Петя, Аня]
2   имеет доход выше среднего, но надежность ниже ...   [Петя]
→ Ссылка