2017-10-17 2 views
1

Quand je fais cela:calculer une valeur dans un Colum de dataframe d'une autre colonne, mais seulement si une condition dans une 3ème colonne est remplie

import pandas as pd 

table={'x':[1,2,3,4,5,1,2,3,4,5,1,2,3,4,5], 
    'y':[1,1,2,2,2,1,2,3,4,5,1,2,2,2,3], 
    'z':[0,0,2,2,0,1,2,0,4,5,0,2,0,2,3], 
    'type':['a','a','a','a','a','b','b','b','b','b','c','c','c','c','c']} 

df=pd.DataFrame(table, columns=['x','y','z','type']) 

mask = df.z==0 

df.x[mask] = 1./df.y[mask] 

Je me plaint et dit le comportement souhaité, mais pandas géants:

Voir les mises en garde dans la documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy df.x [masque] = 1./df.y[mask]

maintenant, ceci est juste un tout petit peu df ici et je peux faire l'avertissement aller loin de faire les changements dans la colonne «x» rangée par rangée avec iloc ou similaire. Mais dans mon programme d'analyse de données, la df est plus large, donc l'approche iloc ralentit un peu.

Existe-t-il un meilleur moyen d'obtenir les modifications apportées dans la colonne x, en utilisant les valeurs de colonnes y, uniquement dans les lignes où une condition est vraie dans la colonne z?

Merci!

Répondre

1

Utilisez loc pour éviter l'indexation de la chaîne ... et l'affectation de l'indice de la chaîne

df.loc[mask, 'x'] = 1./df.loc[mask, 'y'] 

Cela dit. Vous pourriez faire l'indexation en chaîne pour les valeurs que vous essayez d'assigner. Vous n'avez l'avertissement pour avoir tenté d'attribuer à un objet après indexation de la chaîne ....

Cela fonctionne aussi bien

df.x.values[mask] = 1./df.y[mask] 

En plus

df.loc[mask, 'x'] = 1./df.y[mask] 
+0

Cela a fonctionné - muchos gracias! –

+0

@Charlie_M da nada! – piRSquared