web-dev-qa-db-fra.com

plusieurs conditions if else dans pandas dataframe et dériver plusieurs colonnes

J'ai une trame de données comme ci-dessous.

import pandas as pd
import numpy as np
raw_data = {'student':['A','B','C','D','E'],
        'score': [100, 96, 80, 105,156], 
    'height': [7, 4,9,5,3],
    'trigger1' : [84,95,15,78,16],
    'trigger2' : [99,110,30,93,31],
    'trigger3' : [114,125,45,108,46]}

df2 = pd.DataFrame(raw_data, columns = ['student','score', 'height','trigger1','trigger2','trigger3'])

print(df2)

J'ai besoin de dériver la colonne Flag en fonction de plusieurs conditions.

j'ai besoin de comparer les colonnes de score et de hauteur avec les colonnes de déclenchement 1 à 3.

Colonne de drapeau:

  1. si Score supérieur à égal déclencheur 1 et hauteur inférieur à 8 alors Rouge -

  2. si Score supérieur au déclencheur égal 2 et hauteur inférieur à 8, alors Jaune -

  3. si Score supérieur au déclencheur égal 3 et hauteur inférieur à 8, alors Orange -

  4. si la hauteur est supérieure à 8, laissez-la vide

Comment écrire si les conditions else dans pandas dataframe et dériver les colonnes?

Production attendue

  student  score  height  trigger1  trigger2  trigger3    Flag
0       A    100       7        84        99       114  Yellow
1       B     96       4        95       110       125     Red
2       C     80       9        15        30        45     NaN
3       D    105       5        78        93       108  Yellow
4       E    156       3        16        31        46  Orange

Pour l'autre colonne Text1 dans ma question d'origine, j'ai fatigué celle-ci mais les colonnes interger ne convertissent pas la chaîne lors de la concaténation en utilisant astype (str) une autre approche?

def text_df(df):

    if (df['trigger1'] <= df['score'] < df['trigger2']) and (df['height'] < 8):
        return df['student'] + " score " + df['score'].astype(str) + " greater than " + df['trigger1'].astype(str) + " and less than height 5"
    Elif (df['trigger2'] <= df['score'] < df['trigger3']) and (df['height'] < 8):
        return df['student'] + " score " + df['score'].astype(str) + " greater than " + df['trigger2'].astype(str) + " and less than height 5"
    Elif (df['trigger3'] <= df['score']) and (df['height'] < 8):
        return df['student'] + " score " + df['score'].astype(str) + " greater than " + df['trigger3'].astype(str) + " and less than height 5"
    Elif (df['height'] > 8):
        return np.nan
5
Kumar AK

Vous avez besoin d'une comparaison enchaînée à l'aide des bornes supérieure et inférieure

def flag_df(df):

    if (df['trigger1'] <= df['score'] < df['trigger2']) and (df['height'] < 8):
        return 'Red'
    Elif (df['trigger2'] <= df['score'] < df['trigger3']) and (df['height'] < 8):
        return 'Yellow'
    Elif (df['trigger3'] <= df['score']) and (df['height'] < 8):
        return 'Orange'
    Elif (df['height'] > 8):
        return np.nan

df2['Flag'] = df2.apply(flag_df, axis = 1)

    student score   height  trigger1    trigger2    trigger3    Flag
0   A       100     7       84          99          114         Yellow
1   B       96      4       95          110         125         Red
2   C       80      9       15          30          45          NaN
3   D       105     5       78          93          108         Yellow
4   E       156     3       16          31          46          Orange

Remarque: vous pouvez le faire avec un np.where très imbriqué, mais je préfère appliquer une fonction pour plusieurs if-else

17
Vaishali

vous pouvez également appliquer avec une fonction personnalisée sur l'axe 1 comme ceci:

def color_selector(x):
    if (x['trigger1'] <= x['score'] < x['trigger2']) and (x['height'] < 8):
        return 'Red'
    Elif (x['trigger2'] <= x['score'] < x['trigger3']) and (x['height'] < 8):
        return 'Yellow'
    Elif (x['trigger3'] <= x['score']) and (x['height'] < 8):
        return 'Orange'
    Elif (x['height'] > 8):
        return ''
df2 = df2.assign(flag=df2.apply(color_selector, axis=1))

vous obtiendrez quelque chose comme ceci: enter image description here

0
Espoir Murhabazi