2
votes

Changer la colonne des pandas en fonction d'une autre colonne

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


0 commentaires

3 Réponses :


4
votes

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


0 commentaires

0
votes
       A  A_type      B
0  Hello  String  Hello
1  blank   blank  blank
2     Hi  String     Hi
3  blank   blank  blank

1 commentaires

@DebanjanB - Ajouté, merci pour le commentaire, je considérerais cela à l'avenir :)



1
votes

Vous pouvez également essayer:

df['B'] = df.apply(lambda x: x['A'] if x['A_type'] == 'String' else "Blank", axis = 1)


3 commentaires

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.