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:
si Score supérieur à égal déclencheur 1 et hauteur inférieur à 8 alors Rouge -
si Score supérieur au déclencheur égal 2 et hauteur inférieur à 8, alors Jaune -
si Score supérieur au déclencheur égal 3 et hauteur inférieur à 8, alors Orange -
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
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
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))