2
votes

Comment vérifier une condition pour chaque ligne dans Pandas

J'ai un bloc de données contenant des valeurs numériques comme celle-ci:

   col1  col2  col3
0     1     3     1
1    -2    -4    -1
2     3    -5     0

Je souhaite avoir un col3 qui contient:
1 - si toutes les valeurs de la ligne sont> 0,
-1 - si toutes les valeurs de la ligne sont 0 - pour tous les autres cas

Donc, mon df résultant devrait ressembler à ceci:

   col1  col2
0     1     3
1    -2    -4
2     3    -5

S'il vous plaît, aidez-moi en me faisant savoir de la manière la plus pythonique pour y parvenir en utilisant Pandas et / ou Numpy.


0 commentaires

3 Réponses :


2
votes

Utilisez numpy.select () code> :

%timeit np.select([(df.gt(0).all(axis=1)),(df.lt(0).all(axis=1))],[1,-1],0)
#414 µs ± 18.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Explication comme le disent les documents:

numpy.select (condlist, choicelist, default = 0)

Renvoie un tableau tiré des éléments de la liste de sélection, en fonction des conditions.

Ici, la liste de conditions est (df.gt (0) .all (axis = 1)) et (df.lt (0) .all (axis = 1)) qui vérifie les 2 conditions que vous avez mentionnées. ( Pour une meilleure pratique, vous pouvez simplement imprimer la condition pour vérifier la sortie ). reste on place séquentiellement les choix, ici 1 et -1. le dernier paramètre est la valeur par défaut qui est zéro par défaut, vous pouvez spécifier si une autre valeur par défaut est requise.

Performance :

df['col3']=np.select([(df.gt(0).all(axis=1)),(df.lt(0).all(axis=1))],[1,-1],0)
print(df)

   col1  col2  col3
0     1     3     1
1    -2    -4    -1
2     3    -5     0


2 commentaires

Merci d'avoir répondu. J'ai essayé de consulter la documentation de np.select mais je ne pouvais toujours pas la comprendre correctement. Pouvez-vous expliquer comment cela fonctionne?


@SomnathRakshit J'ai mis à jour ma réponse avec une brève explication. Si vous avez trouvé la réponse utile, envisagez de voter et d'accepter la réponse. Merci



1
votes

Vous pouvez également utiliser df.all():

df['col3'] = (df > 0).all(axis=1) * 1 + (df < 0).all(axis=1) * -1

print(df)

   col1  col2  col3
0     1     3     1
1    -2    -4    -1
2     3    -5     0


4 commentaires

J'aime cette approche. Mais comment fonctionne la troisième condition qui définit la valeur par défaut de 0? La valeur par défaut est 0 dans un df?


Dans le troisième cas, les deux produits renverront 0 (un seul de ces appels all () renverra true, ou les deux seront faux). Ce sera donc 0 + 0.


Ah, c'est vrai. Mais disons que col3 doit être défini comme des chaînes au lieu de nombres, par exemple "Positif" au lieu de 1, "Négatif" au lieu de -1 et "Indécis" au lieu de 0. Comment peut-on alors l'utiliser?


@SomnathRakshit Il existe de nombreuses façons de le faire. Celui qui me vient à l'esprit est d'appliquer un lambda sur ce résultat



1
votes

une autre solution est:

df = pd.DataFrame([[1, 3], [-2, -4], [3, -5]], columns=['col1', 'col2'])
df['col3'] = df.gt(0).all(axis=1) * 1 - df.lt(0).all(axis=1) * 1
print(df)

   col1  col2  col3
0     1     3     1
1    -2    -4    -1
2     3    -5     0


0 commentaires