Par exemple, j'ai un DF simple:
import pandas as pd
from random import randint
df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
'B': [randint(1, 9)*10 for x in xrange(10)],
'C': [randint(1, 9)*100 for x in xrange(10)]})
Puis-je sélectionner des valeurs dans 'A' pour lesquelles les valeurs correspondantes pour 'B' seront supérieures à 50 et pour 'C' - pas égal à 900, en utilisant les méthodes et les idiomes de Pandas?
df.query
etpd.eval
semblent être de bons ajustements pour ce cas d'utilisation. Pour plus d'informations sur lapd.eval()
famille de fonctions, leurs caractéristiques et leurs cas d'utilisation, veuillez consulter Évaluation des expressions dynamiques dans les pandas à l'aide de pd.eval () .Réponses:
Sûr! Installer:
Nous pouvons appliquer des opérations sur les colonnes et obtenir des objets de la série booléenne:
[Mise à jour, pour passer au nouveau style
.loc
]:Et puis nous pouvons les utiliser pour indexer dans l'objet. Pour un accès en lecture, vous pouvez chaîner des index:
mais vous pouvez avoir des ennuis à cause de la différence entre une vue et une copie en faisant cela pour l'accès en écriture. Vous pouvez utiliser à la
.loc
place:Notez que j'ai accidentellement tapé
== 900
et non!= 900
, ou~(df["C"] == 900)
, mais je suis trop paresseux pour le corriger. Exercice pour le lecteur. : ^)la source
.loc
mise à jour - il serait bon que vous clarifiiez où nous obtenons une copie et où une vue.{TypeError}cannot compare a dtyped [int64] array with a scalar of type [bool]
Une autre solution consiste à utiliser la requête méthode de :
Maintenant, si vous souhaitez modifier les valeurs renvoyées dans la colonne A, vous pouvez enregistrer leur index:
.... et utilisez
.iloc
pour les changer c'est à dire:la source
Et n'oubliez pas d'utiliser des parenthèses!
Gardez à l'esprit que l'
&
opérateur a priorité sur les opérateurs tels que>
ou<
etc. C'est pourquoiévalue à
False
. Par conséquent, si vous utilisezpd.loc
, vous devez mettre des crochets autour de vos instructions logiques, sinon vous obtenez une erreur. Voilà pourquoi:au lieu de
ce qui entraînerait
la source
Vous pouvez utiliser des pandas qui ont des fonctions intégrées pour la comparaison. Donc, si vous souhaitez sélectionner des valeurs de "A" qui sont remplies par les conditions de "B" et "C" (en supposant que vous souhaitez récupérer un objet pandas DataFrame)
df[['A']][df.B.gt(50) & df.C.ne(900)]
df[['A']]
vous renverra la colonne A au format DataFrame.La fonction 'gt' des pandas renverra les positions de la colonne B qui sont supérieures à 50 et 'ne' renverra les positions non égales à 900.
la source