J'ai un DataFrame pandas qui contient ressemble à ceci:
df['B'] = df['A'] for j in df['A_type']: for i in df['B']: if j == "String": i = i else: i = "blank"
Je veux créer une troisième colonne qui rapporte la même valeur que A si A a l'élément "A_type" correspondant nommé " String ", imprimer" vide "sinon. La colonne ressemblerait à ceci:
B "Hello" "blank" "Hi" "blank"
J'ai essayé de faire quelque chose comme:
A A_type "Hello" String 15 Integer "Hi" String 56.78 Float
Existe-t-il une approche plus efficace pour problème qui peut m'aider à éviter toutes ces boucles for?
Merci beaucoup à l'avance
3 Réponses :
Utilisez Series.where
ou
Series.mask
avec une condition inversée, ou numpy. où
:
df['B'] = df['A'].where(df['A_type'] == "String", 'blank') #df['B'] = df['A'].mask(df['A_type'] != "String", 'blank') #alternative #df['B'] = np.where(df['A_type'] == "String", df['A'], 'blank') print (df) A A_type B 0 Hello String Hello 1 15 Integer blank 2 Hi String Hi 3 56.78 Float blank
A A_type B 0 Hello String Hello 1 blank blank blank 2 Hi String Hi 3 blank blank blank
@DebanjanB - Ajouté, merci pour le commentaire, je considérerais cela à l'avenir :)
Vous pouvez également essayer:
df['B'] = df.apply(lambda x: x['A'] if x['A_type'] == 'String' else "Blank", axis = 1)
Ne pas utiliser d'application, car des boucles sous le capot, surtout s'il existe des alternatives vectorisées.
Parce qu'il est lent dans les grands dataframes
OK merci. Je vais essayer de le modifier en le rendant compatible avec un grand df.