Je voudrais filtrer proprement un dataframe à l'aide de regex sur l'une des colonnes.
Pour un exemple artificiel:
In [210]: foo = pd.DataFrame({'a' : [1,2,3,4], 'b' : ['hi', 'foo', 'fat', 'cat']})
In [211]: foo
Out[211]:
a b
0 1 hi
1 2 foo
2 3 fat
3 4 cat
Je veux filtrer les lignes sur celles qui commencent par f
utiliser une expression régulière. Commencez par:
In [213]: foo.b.str.match('f.*')
Out[213]:
0 []
1 ()
2 ()
3 []
Ce n'est pas très utile. Cependant, cela me donnera mon index booléen:
In [226]: foo.b.str.match('(f.*)').str.len() > 0
Out[226]:
0 False
1 True
2 True
3 False
Name: b
Donc je pourrais alors faire ma restriction en:
In [229]: foo[foo.b.str.match('(f.*)').str.len() > 0]
Out[229]:
a b
1 2 foo
2 3 fat
Cela me fait mettre artificiellement un groupe dans l'expression régulière, et cela ne semble peut-être pas la voie à suivre. Y a-t-il une meilleure manière de faire cela?
foo[foo.b.str.startswith("f")]
cela fonctionnera.foo[foo.b.str.match('(f.*)').str.len() > 0]
c'est une assez bonne solution! Plus personnalisable et utile que commence avec, car il contient la polyvalence de l'expression régulière.foo[foo.b.str.match('f.*')]
fonctionne dans pandas 0.24.2 pour moi.Réponses:
Utilisez contient à la place:
la source
df.loc[df.b.str.contains('^f'), :]
df[df.b.str.contains('^f'), :]
Il existe déjà une fonction de gestion des chaînes
Series.str.startswith()
. Tu devrais essayerfoo[foo.b.str.startswith('f')]
.Résultat:
Je pense à ce que vous attendez.
Vous pouvez également utiliser contient avec l'option regex. Par exemple:
Résultat:
na=False
est d'éviter les erreurs en cas de valeurs nan, nulles, etc.la source
df[~df.CITY.str.contains('~.*', regex= True, na=False)]
Recherche sur plusieurs colonnes avec dataframe:
la source
frame
? et'C:\test\test.txt'
? Il semble que vous répondiez à une question différente.C'est peut-être un peu tard, mais c'est maintenant plus facile à faire dans Pandas. Vous pouvez appeler match with
as_indexer=True
pour obtenir des résultats booléens. Ceci est documenté (avec la différence entrematch
etcontains
) ici .la source
Merci pour l'excellente réponse @ user3136169, voici un exemple de la façon dont cela pourrait être fait en supprimant également les valeurs NoneType.
Vous pouvez également ajouter regex en tant qu'arg:
la source
Ecrire une fonction booléenne qui vérifie l'expression régulière et utilise apply sur la colonne
la source
Utilisation de la
str
tranchela source