La sélection avec des critères complexes de pandas.DataFrame
Par exemple, j'ai simple DF:
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 de A pour lesquelles les valeurs correspondantes pour les " B " sera supérieur à 50, et pour 'C' - pas égale à 900, en utilisant les méthodes et les idiomes de Pandas?
df.query
etpd.eval
sembler bons ajustements pour ce cas d'utilisation. Pour plus d'informations sur lepd.eval()
famille de fonctions, de leurs caractéristiques et de cas d'utilisation, veuillez visiter Dynamique de l'Évaluation de l'Expression dans les pandas à l'aide de la mp.eval().- Peut ainsi vérifier @Gecko 's réponse: stackoverflow.com/questions/13611065/...
Vous devez vous connecter pour publier un commentaire.
Sûr! Programme d'installation:
Nous pouvons appliquer des opérations de colonne et obtenir boolean Série d'objets:
[Mise à jour pour passer à la nouvelle-style
.loc
]:Et puis on peut les utiliser pour d'index de l'objet. Pour l'accès en lecture, vous pouvez indices en chaîne:
mais vous pouvez avoir des ennuis à cause de la différence entre une vue et une copie de le faire pour l'accès en écriture. Vous pouvez utiliser
.loc
à la place:Remarque que j'ai accidentellement tapé
== 900
et pas!= 900
, ou~(df["C"] == 900)
, mais je suis trop paresseux pour le fixer. Exercice pour le lecteur. :^).loc
mise à jour - il serait bon si vous préciser où nous en obtenir une copie et d'où la vue.{TypeError}cannot compare a dtyped [int64] array with a scalar of type [bool]
df.loc[(df["B"] > 'abc') & (df["B"] == 'def'), "A"]
que ça va marcher, je suis vide df.Une autre solution est d'utiliser le requête méthode:
Maintenant, si vous souhaitez modifier les valeurs renvoyées dans la colonne A, vous pouvez enregistrer leurs index:
....et l'utilisation
.iloc
de les changer je.e:Et n'oubliez pas d'utiliser les parenthèses!
Gardez à l'esprit que
&
opérateur prend la priorité sur les opérateurs tels que les>
ou<
etc. C'est pourquoiévalue à
False
. Par conséquent, si vous utilisezpd.loc
, vous avez besoin de mettre des parenthèses autour de vos déclarations logiques, sinon vous aurez une erreur. C'est pourquoi:au lieu de
qui aurait pour résultat
Vous pouvez utiliser les pandas, il a quelques fonctions intégrées pour la comparaison. Donc, si vous voulez 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 DataFrame pandas objet)
df[['A']][df.B.gt(50) & df.C.ne(900)]
df[['A']]
va vous redonner la colonne A dans DataFrame format.pandas 'gt' fonction retourne la position de la colonne B sont supérieurs à 50 et 'ne' sera de retour le postes pas égal à 900.