J'ai le DF suivant avec 5 colonnes où AA est la somme de (ww + zz):   Je suis impatient que chaque fois que la colonne YY a une valeur de 0, puis Ajoutez la valeur de ZZ dans WW, WW le définissez à zéro et si la valeur de ZZ est différente de zéro, laissez-la telle qu'elle est.  p>   La sortie souhaitée serait la suivante:  P>      xx    yy    ww   zz  aa
A    5     3     4    2   6  
B    2     0     5    0   5
C    3     0     6    0   6  
D    3     2     3    3   6
4 Réponses :
 Est-ce ce que vous êtes après?   Si la performance est une préoccupation, utilisez cette version:  p> 
                                                    Bien que cela fonctionne,  appliquer (PD.Series)  code> est quelque chose que vous ne voulez pas faire, car sa ralentissement teribré.                                                
                                                    En outre, la première approche pourrait être écrite comme  df [['ww', 'zz']] = df.apply (lambda x: [x.zz + x.ww, 0] si x.yy == 0 0] sinon [x.ww, x.zz], axis = 1, résultat_type = 'expand')  code>. Voir Anky_91's Répondre ici 
Merci @erfan, il suffit d'ajouter une version plus rapide si la performance est une préoccupation.
@Markwang, merci et je n'ai jamais utilisé ce paramètre. Bon d'apprendre quelque chose de nouveau tous les jours :-)
                                                    En utilisant  lambda  code> deux fois ne sera plus performant. Il y a des réponses vectorisées ici, op n'est probablement pas au courant.                                                
@Erfan, dans la deuxième solution, la candidature est sage sur la colonne et ses milliers de personnes sont plus rapides que la 1ère solution. La performance est similaire à votre solution.
                                                    Toujours  2.3  code> fois plus lent que la solution vectorisée. Voir les timings dans ma réponse.  Appliquer lambda x  code> ne sera jamais plus rapide que les solutions optimisées.                                                
Essayez celui-ci:
>>> df=pd.DataFrame(data={"xx": [5,2,3,3], "yy": [3,0,0,2], "ww": [4,4,4,3], "zz": [2,1,2,3], "aa": [6,5,6,6]}, index=["A", "B", "C", "D"])
>>> df["ww"][df["yy"]==0]=df["ww"]+df["zz"]
>>> df["zz"][df["yy"]==0]=0
>>> df
   xx  yy  ww  zz  aa
A   5   3   4   2   6
B   2   0   5   0   5
C   3   0   6   0   6
D   3   2   3   3   6
                                 Créer un masque identifiant les lignes avec  YY  code> Colonne eq à  0  code> et utilisez  où  code> pour appliquer la condition. mask_0 = df['yy'].eq(0)
df['ww'] = df['zz'].where(mask_0,0) + df['ww']
df['zz'] = df['zz'].where(~mask_0,0)
 en utilisant     sortie  strong>  p>    Test de synchronisation  strong>  P>  np.where  code>  pour ajouter conditionnellement  zz  code> à  ww  code> et   masque  code>  pour remplacer les valeurs dans  zz  code> avec  0  code> si  yy == 0  code>: 
 %%timeit
(
    df.assign(y=df.yy.eq(0))
    .assign(ww=lambda x: x.zz.mul(x.y).add(x.ww))
    .assign(zz=lambda x: x.zz.mul(~x.y))
    .drop('y', axis=1)
)
31.3 ms ± 2.36 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)