4 votes

Création d'une liste à partir d'un fichier de données à l'aide de conditionnelles

J'ai besoin de créer une liste de patients dans une base de données qui les classe comme "élevés", "moyens" ou "faibles" en fonction de leur IMC et du fait qu'ils fument ou non. Lorsque j'exécute le code, j'obtiens "Moyen" pour les six entrées. (Des pseudo-noms et des données ont été utilisés)

df = pd.DataFrame({'Name':['Jordan', 'Jess', 'Jake', 'Alice', 'Alan', 'Lauren'],
                   'Age':[26, 23, 19, 20, 24, 28],
                   'Sex':['M', 'F' , 'M', 'F', 'M', 'F'],
                   'BMI':[26, 22, 24, 17, 35, 20],
                   'Smokes':['No', 'No', 'Yes', 'No', 'Yes', 'No']})

risk_list = []

for i in df.Name:
  if df.BMI.any() > 30 | df.BMI.any() < 19.99 | df.Smokes.any() == "Yes":
    risk_list.append("High")
  elif df.BMI.any() >= 25 & df.BMI.any() <= 29.99:
    risk_list.append("Medium")
  elif df.BMI.any() < 24.99 & df.BMI.any() > 19.99 and df.Smokes.any() == "No":
    risk_list.append("Low")

print(risk_list)

Sortie :

['Medium', 'Medium', 'Medium', 'Medium', 'Medium', 'Medium']

Je suis novice en matière de pandas et de python. Je pense que je suis proche du but mais je n'arrive pas à comprendre pourquoi mes données ne sont pas renvoyées correctement.

Merci.

4voto

Quang Hoang Points 191

Il y a beaucoup de choses dans vos codes. Pour n'en citer que quelques-uns :

  1. Vous avez besoin de plusieurs parenthèses : df.BMI.any() > 30 | df.BMI.any() < 19.99 devrait être (df.BMI.any() > 30) | (df.BMI.any() < 19.99)

  2. & est différent de and

  3. tout ce qui se trouve à l'intérieur de la boucle, par exemple df.BMI.any() est indépendant de la ligne que vous regardez, c'est-à-dire Name afin d'obtenir les mêmes valeurs partout.

Je pense que vous pouvez utiliser np.select :

np.select([df.BMI.gt(30) | df.BMI.lt(19.99) | df.Smokes.eq('Yes'),
           df.BMI.between(25,29.99)],
          ['High', 'Medium'], 'Low')

Sortie :

array(['Medium', 'Low', 'High', 'High', 'High', 'Low'], dtype='<U6')

2voto

Camilo Martinez Points 1126

En plus de la réponse de @QuangHoang, l'itération sur un dataframe est quelque peu intuitive. Vous utilisez .iterrows() et non votre Name colonne car il ne s'agit pas d'un dictionnaire.

risk_list = []

for _, i in df.iterrows():
    if i.BMI > 30 or i.BMI < 19.99 or i.Smokes == "Yes":
        risk_list.append("High")
    elif i.BMI >= 25 and i.BMI <= 29.99:
        risk_list.append("Medium")
    elif i.BMI < 24.99 and i.BMI > 19.99 and i.Smokes == "No":
        risk_list.append("Low")

>>> print(risk_list)
    ['Medium', 'Low', 'High', 'High', 'High', 'Low']

2voto

Celius Stingher Points 11977

Vous pouvez définir cette fonction et la passer à .apply() :

def risk_eval(row):
  if row.BMI > 30 | row.BMI < 19.99 | row.Smokes== "Yes":
    return "High"
  elif row.BMI >= 25 & row.BMI <= 29.99:
    return"Medium"
  elif rowBMI < 24.99 & row.BMI> 19.99 and row.Smokes == "No":
    return "Low"

df['Risk'] = df.apply(lambda x: risk_eval(x),axis=1)

Ensuite, vous obtiendrez la liste avec :

df['Risk'].values.tolist()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X