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.
3 Réponses :
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
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 a> la réponse. Merci
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
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
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