0
votes

Modification de 2 colonnes basées sur une condition dans une colonne différente

J'ai le DF suivant avec 5 colonnes où AA est la somme de (ww + zz): xxx pré>

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


0 commentaires

4 Réponses :


2
votes

Est-ce ce que vous êtes après? XXX

Si la performance est une préoccupation, utilisez cette version: xxx


7 commentaires

Bien que cela fonctionne, appliquer (PD.Series) 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') . Voir Anky_91's Répondre ici Stackoverflow.com/Questtions/57646384/...


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 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 fois plus lent que la solution vectorisée. Voir les timings dans ma réponse. Appliquer lambda x ne sera jamais plus rapide que les solutions optimisées.



0
votes

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


0 commentaires

1
votes

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)


0 commentaires

1
votes

en utilisant 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>: xxx pré>

sortie strong> p> xxx pré>


Test de synchronisation strong> P>

%%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)


0 commentaires