pandas: le meilleur moyen de sélectionner toutes les colonnes dont les noms commencent par X
J'ai un DataFrame:
import pandas as pd
import numpy as np
df = pd.DataFrame({'foo.aa': [1, 2.1, np.nan, 4.7, 5.6, 6.8],
'foo.fighters': [0, 1, np.nan, 0, 0, 0],
'foo.bars': [0, 0, 0, 0, 0, 1],
'bar.baz': [5, 5, 6, 5, 5.6, 6.8],
'foo.fox': [2, 4, 1, 0, 0, 5],
'nas.foo': ['NA', 0, 1, 0, 0, 0],
'foo.manchu': ['NA', 0, 0, 0, 0, 0],})
Je veux sélectionner une valeur de 1 dans les colonnes de départ avec foo.
. Est-il une meilleure façon de le faire d'autre que:
df2 = df[(df['foo.aa'] == 1)|
(df['foo.fighters'] == 1)|
(df['foo.bars'] == 1)|
(df['foo.fox'] == 1)|
(df['foo.manchu'] == 1)
]
Quelque chose de semblable à écrire quelque chose comme:
df2= df[df.STARTS_WITH_FOO == 1]
La réponse devrait imprimer un DataFrame comme ceci:
bar.baz foo.aa foo.bars foo.fighters foo.fox foo.manchu nas.foo
0 5.0 1.0 0 0 2 NA NA
1 5.0 2.1 0 1 4 0 0
2 6.0 NaN 0 NaN 1 0 1
5 6.8 6.8 1 0 5 0 0
[4 rows x 7 columns]
Vous devez vous connecter pour publier un commentaire.
Il suffit de faire une liste de compréhension pour créer vos colonnes:
Une autre méthode consiste à créer une série de colonnes et d'utiliser le vectorisées str méthode
startswith
:Afin d'obtenir ce que vous voulez, vous devez ajouter les éléments suivants pour filtrer les valeurs qui ne répondent pas à vos
==1
critères:MODIFIER
OK après avoir vu ce que vous voulez l'enchevêtrement réponse est celle-ci:
startswith
serait de la purepandas
méthode, à l'aide d'une compréhension de liste est en fait la méthode la plus rapide, donc j'ai posté les deux méthodesMaintenant que les pandas' index de soutien des opérations de la chaîne, sans doute le plus simple et le meilleur moyen de sélectionner les colonnes commençant par " foo " est juste:
Alternativement, vous pouvez filtrer la colonne (ou une ligne) des étiquettes avec
df.filtre()
. Pour spécifier une expression régulière pour faire correspondre les noms commençant parfoo.
:Pour ne sélectionner que les lignes requises (contenant un
1
) et les colonnes, vous pouvez utiliserloc
, sélectionnez les colonnes à l'aide defilter
(ou toute autre méthode) et les lignes à l'aide deany
:df.filter(regex=r'^foo\.', axis=1) == 1
(laissez-moi savoir si j'ai mal compris ce que vous voulez).foo
Ma solution. Il peut être plus lent sur les performances:
Une autre option pour la sélection des entrées souhaitées est d'utiliser
map
:qui vous donne toutes les colonnes pour les lignes qui contiennent un
1
:La sélection d'une ligne est fait par
comme dans @ajcr la réponse qui vous donne:
ce qui signifie que la ligne
3
et4
ne contient pas de1
et ne sera pas sélectionné.La sélection des colonnes est effectué à l'aide Boolean indexation comme ceci:
Dans l'exemple ci-dessus cela renvoie
Donc, si une colonne n'a pas commencer avec
foo
,False
est retourné et la colonne n'est donc pas sélectionné.Si vous voulez juste pour renvoyer toutes les lignes qui contiennent un
1
- que votre sortie désirée le suggère, vous pouvez simplement fairequi renvoie