3
votes

comment passer une requête pandas vide

Pour améliorer un modèle, je passe plusieurs .query () à un dataframe pandas. Dans la boucle for, j'aurais également une requête vide, mais je n'ai rien trouvé dans la documentation. Il devrait renvoyer le dataframe complet.

J'ai essayé:

temp_df.query(None)
temp_df.query()

Mais cela ne fonctionne pas. D'autres idées?

Merci


5 commentaires

Que doit renvoyer une requête vide?


le dataframe complet


Pourquoi ne renvoyez-vous pas simplement temp_df dans ce cas?


+1 sur cette question. Un bon scénario que j'ai régulièrement est que je crée des requêtes par programme comme dans q = some_func (); view = temp_df.query (q) et j'aimerais avoir la requête "vide" pour renvoyer le dataframe complet. Une solution triviale serait d'utiliser quelque chose comme si q vaut None: view = temp_df else view = temp_df.query (q) . Mais je préfère ne pas le faire. Une requête vide serait idéale pour ces cas.


Une autre façon d'exprimer cela est de le considérer comme l'équivalent de WHERE 1 = 1 en SQL.


3 Réponses :


1
votes

Le mieux que je puisse trouver au guichet automatique, mais toujours pas satisfaisant:

col = temp_df.columns[0]
temp_df.query(f"{col}.isnull() or {col}.notnull()")


1 commentaires

ça marche :) Je suppose qu'une solution plus pratique devrait être implémentée par les développeurs de pandas.



1
votes

Utilisez un tableau booléen de la même longueur que votre DataFrame:

In [2]: df = pd.DataFrame(np.arange(16).reshape(4, 4), columns=list('ABCD'))

In [3]: trivially_true = np.repeat(True, len(df))

In [4]: trivially_false = np.repeat(False, len(df))

In [5]: df
Out[5]: 
    A   B   C   D
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15

In [6]: df.query('@trivially_true')
Out[6]: 
    A   B   C   D
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15

In [7]: df.query('@trivially_false')
Out[7]: 
Empty DataFrame
Columns: [A, B, C, D]
Index: []


0 commentaires

1
votes

Vous pouvez utiliser le mot-clé 'index' pour cela:

temp_df.query('index == index or index != index')

Cela vous donnera à la fois des indices nuls et non nuls du dataframe, c'est-à-dire l'intégralité du dataframe.

p>


0 commentaires