2017-10-20 20 views
0

Voici un petit échantillon de mon jeu de données:En utilisant l'opérateur OR semble ne prendre la première des deux conditions lorsqu'il est utilisé avec np.where filtre

Search_Term Exit_Page     Unique_Searches Exit_Pages_actual 
nitrile gloves /store/catalog/product.jsp?  10  /store/catalog/product.jsp? 
zytek gloves /store/product/KT781010   20  /store/pro 

ce qui devrait être assez facile, ne sais pas pourquoi je Je n'arrive pas à travailler. J'essaye de tirer dans la colonne Exit_Pages_actual quand tous les caractères dans le Exit_Page quand les 10 premiers caractères sont "/ store/pro" ou "/ store/cat". Quand ce n'est pas le cas, je veux que seulement les 10 premiers caractères de Exit_Page soient tirés. Comme vous pouvez le voir ci-dessus, mon code fonctionne bien pour le catalogue mais pas pour le produit (aka fonctionne pour la première condition dans mon OR mais pas le 2ème par le code ci-dessous). Qu'est-ce qui ne va pas? Donc, il me a pas de message d'erreur, il n'a tout simplement pas donne le bon résultat pour le produit, les sorties que les 10 premiers caractères plutôt que la chaîne entière:

Exit_Pages['Exit_Pages_actual'] = np.where(Exit_Pages['Exit_Page'].str[:10]==('/store/cat' or '/store/pro'),Exit_Pages['Exit_Page'].str[:],Exit_Pages['Exit_Page'].str[:10]) 

Exit_Pages 
+1

la partie «/ store/cat» ou «/ store/pro» est évaluée à «/ store/cat». Ceci est ensuite utilisé dans la comparaison. Vérifiez [priorité d'opérateur] (https://docs.python.org/3/reference/expressions.html). –

+3

Possible copie de [Numpy où la fonction de plusieurs conditions] (https://stackoverflow.com/questions/16343752/numpy-where-function-multiple-conditions) –

+0

@ Tw UxTLi51Nus hmmm, merci pour le commentaire! J'ai essayé quelques autres choses qui ne fonctionnent pas comme ceci: 'Exit_Pages [' Exit_Pages_actual '] = np.where (Exit_Pages [' Exit_Page ']. Str [: 10] =='/store/cat 'ou np. où (Exit_Pages ['Exit_Page']. str [: 10] == '/ store/pro'), Exit_Pages ['Exit_Page']. str [:], Exit_Pages ['Exit_Page']. str [: 10]) ' et cela me donne un ValueError: La valeur de vérité d'une série est ambiguë. Utilisez a.empty, a.bool(), a.item(), a.any() ou a.all(). – mkheifetz

Répondre

1

@ tw-uxtli51nus dans les commentaires est fondamentalement correcte.

Nous pouvons accomplir ce que vous voulez en encapsulant des conditions logiques avec() et en utilisant '|' à la place de 'ou'.

Alors np.where ressemblerait à ceci:

df['new_col'] = np.where(
    (
    (df['Exit_Page'].str[:10]=='/store/cat') 
    | 
    (df['Exit_Page'].str[:10]=='/store/pro') 
    ) 
    ,df['Exit_Page'] 
    ,df['Exit_Page'].str[:10]) 

tente de le rendre plus lisible car ce genre de choses est laid à regarder.

Nous pouvons rendre notre vie plus facile en lieu d'essayer une technique similaire à ce que les documents suggèrent d'utiliser np.isin(): https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.where.html

mais je n'ai pas la version correcte de numpy pour écrire un vrai exemple, malheureusement.

+0

Merci, cela a fonctionné! Donc c'est ma compréhension que la seule chose que vous avez changé était de remplacer "|" au lieu de "ou"? Dans quelle situation utilisez-vous l'un par rapport à l'autre? Je ne suis pas sûr de bien comprendre la différence entre les deux – mkheifetz

+1

Pour être honnête je n'ai pas une bonne idée! il y a https://www.tutorialspoint.com/python/bitwise_operators_example.htm et une réponse loooong à https://stackoverflow.com/questions/16343752/numpy-where-function-multiple-conditions c'est beaucoup mieux que ma réponse ! – Dylan

+0

oui j'ai essayé de le lire mais je ne l'ai pas suivi entièrement ... Mais merci, vous avez dit très clairement où était mon erreur – mkheifetz