La plupart des opérations en pandas
peut être accompli avec l' opérateur Enchaînement ( groupby
, aggregate
, apply
, etc.), mais la seule façon que j'ai trouvé aux lignes de filtre se fait via l' indexation de support normale
df_filtered = df[df['column'] == value]
C'est peu attrayant car cela nécessite que j'attribue df
une variable avant de pouvoir filtrer sur ses valeurs. Y a-t-il quelque chose de plus semblable au suivant?
df_filtered = df.mask(lambda x: x['column'] == value)
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 fonctionnalités et leurs cas d'utilisation, veuillez consulter Évaluation des expressions dynamiques dans les pandas à l'aide de pd.eval () .Réponses:
Je ne suis pas tout à fait sûr de ce que vous voulez, et votre dernière ligne de code n'aide pas non plus, mais de toute façon:
Le filtrage "chaîné" se fait en "chaînant" les critères de l'index booléen.
Si vous souhaitez chaîner des méthodes, vous pouvez ajouter votre propre méthode de masque et l'utiliser.
la source
(df.A == 1) & (df.D == 6)
, est-ce que le "&" est un opérateur surchargé dans Pandas?pandas.
. Tu devraisimport pandas as pd
.import pandas as pd
c'est une pratique courante maintenant. Je doute que ce soit lorsque j'ai répondu à la question.Les filtres peuvent être chaînés à l'aide d'une requête Pandas :
Les filtres peuvent également être combinés en une seule requête:
la source
df.query('a in list([1,2])')
,s = set([1,2]); df.query('a in @s')
.La réponse de @lodagro est excellente. Je voudrais l'étendre en généralisant la fonction de masque comme:
Ensuite, vous pouvez faire des choses comme:
la source
DataFrame
s!Depuis la version 0.18.1, la
.loc
méthode accepte un appelable pour la sélection. Avec les fonctions lambda, vous pouvez créer des filtres chaînables très flexibles:Si tout ce que vous faites est de filtrer, vous pouvez également omettre le
.loc
.la source
Je propose cela pour des exemples supplémentaires. Il s'agit de la même réponse que https://stackoverflow.com/a/28159296/
J'ajouterai d'autres modifications pour rendre ce post plus utile.
pandas.DataFrame.query
query
a été fait exactement dans ce but. Tenez compte de la trame de donnéesdf
Utilisons
query
pour filtrer toutes les lignes oùD > B
Que nous enchaînons
la source
J'avais la même question, sauf que je voulais combiner les critères dans une condition OU. Le format donné par Wouter Overmeire combine les critères en une condition ET telle que les deux doivent être satisfaites:
Mais j'ai trouvé que, si vous encapsulez chaque condition
(... == True)
et joignez les critères avec un tuyau, les critères sont combinés dans une condition OR, satisfait chaque fois que l'un d'eux est vrai:la source
df[(df.A==1) | (df.D==6)]
suffisant pour ce que vous essayez d'accomplir?pandas propose deux alternatives à la réponse de Wouter Overmeire qui ne nécessitent aucune dérogation. On est
.loc[.]
avec un callable, comme dansl'autre est
.pipe()
, comme dansla source
Ma réponse est similaire aux autres. Si vous ne souhaitez pas créer de nouvelle fonction, vous pouvez utiliser ce que les pandas ont déjà défini pour vous. Utilisez la méthode du tuyau.
la source
a.join(b).pipe(lambda df: df[df.column_to_filter == 'VALUE'])
Si vous souhaitez appliquer tous les masques booléens courants ainsi qu'un masque à usage général, vous pouvez ranger les éléments suivants dans un fichier, puis les affecter simplement comme suit:
Usage:
C'est un peu hacky mais cela peut rendre les choses un peu plus propres si vous coupez et modifiez en continu des ensembles de données en fonction des filtres. Il y a aussi un filtre à usage général adapté de Daniel Velkov ci-dessus dans la fonction gen_mask que vous pouvez utiliser avec les fonctions lambda ou autrement si vous le souhaitez.
Fichier à enregistrer (j'utilise masks.py):
la source
Cette solution est plus hackeuse en terme d'implémentation, mais je la trouve beaucoup plus propre en terme d'utilisation, et elle est certainement plus générale que les autres proposées.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Vous n'avez pas besoin de télécharger l'intégralité du référentiel: enregistrer le fichier et faire
devrait suffire. Ensuite, vous l'utilisez comme ceci:
Un exemple d'utilisation un peu moins stupide:
Soit dit en passant: même dans le cas où vous utilisez simplement des cols booléens,
peut être beaucoup plus efficace que
car il évalue
cond2
uniquement oùcond1
estTrue
.AVERTISSEMENT: J'ai d'abord donné cette réponse ailleurs parce que je ne l'avais pas vu.
la source
Je veux juste ajouter une démonstration en utilisant
loc
pour filtrer non seulement par lignes mais aussi par colonnes et certains mérites de l'opération chaînée.Le code ci-dessous peut filtrer les lignes par valeur.
En le modifiant un peu, vous pouvez également filtrer les colonnes.
Alors pourquoi voulons-nous une méthode chaînée? La réponse est simple à lire si vous avez plusieurs opérations. Par exemple,
la source
semble fonctionner: vous pouvez également imbriquer l'
[]
opérateur. Ils l'ont peut-être ajouté depuis que vous avez posé la question.la source
df
n'a pas beaucoup de sens dans une chaîne car maintenant ne fait pas nécessairement référence à la sortie de la partie précédente de la chaîne.Si vous définissez vos colonnes pour rechercher en tant qu'index, vous pouvez utiliser
DataFrame.xs()
pour prendre une coupe transversale. Ce n'est pas aussi polyvalent que lesquery
réponses, mais cela peut être utile dans certaines situations.la source
Vous pouvez également tirer parti de la bibliothèque numpy pour les opérations logiques. C'est assez rapide.
la source