733 votes

Sélection par chaîne partielle dans un DataFrame pandas

J'ai un DataFrame avec 4 colonnes dont 2 contiennent des valeurs de type chaîne. Je me demandais s'il existait un moyen de sélectionner des lignes sur la base d'une correspondance partielle de chaînes de caractères dans une colonne particulière ?

En d'autres termes, une fonction ou une fonction lambda qui ferait quelque chose comme

re.search(pattern, cell_in_question) 

renvoyant un booléen. Je connais la syntaxe de df[df['A'] == "hello world"] mais je n'arrive pas à trouver un moyen de faire de même avec une correspondance partielle de chaîne de caractères, par exemple 'hello' .

Quelqu'un pourrait-il m'indiquer la bonne direction ?

5voto

katu txakurra Points 106

L'utilisation de contains n'a pas bien fonctionné pour ma chaîne contenant des caractères spéciaux. La recherche a fonctionné.

df[df['A'].str.find("hello") != -1]

5voto

Grant Shannon Points 575

Un exemple plus général - si vous recherchez des parties d'un mot OU des mots spécifiques dans une chaîne de caractères :

df = pd.DataFrame([('cat andhat', 1000.0), ('hat', 2000000.0), ('the small dog', 1000.0), ('fog', 330000.0),('pet', 330000.0)], columns=['col1', 'col2'])

Parties spécifiques de la phrase ou du mot :

searchfor = '.*cat.*hat.*|.*the.*dog.*'

Colonne de création montrant les lignes affectées (peut toujours être filtrée si nécessaire)

df["TrueFalse"]=df['col1'].str.contains(searchfor, regex=True)

    col1             col2           TrueFalse
0   cat andhat       1000.0         True
1   hat              2000000.0      False
2   the small dog    1000.0         True
3   fog              330000.0       False
4   pet 3            30000.0        False

4voto

Serhii Kushchenko Points 182

Vous souhaitez peut-être rechercher un texte dans toutes les colonnes du cadre de données Pandas, et pas seulement dans un sous-ensemble de celles-ci. Dans ce cas, le code suivant vous sera utile.

df[df.apply(lambda row: row.astype(str).str.contains('String To Find').any(), axis=1)]

Avertissement. Cette méthode est relativement lente, mais pratique.

2voto

xpeiro Points 169

Il y a des réponses avant celle-ci qui accomplissent la fonction demandée, de toute façon je voudrais montrer la manière la plus générale :

df.filter(regex=".*STRING_YOU_LOOK_FOR.*")

Cette méthode vous permet d'obtenir la colonne que vous recherchez, quelle que soit la manière dont elle est écrite.

(Évidemment, vous devez écrire l'expression regex appropriée pour chaque cas).

1 votes

Ce filtre sur la colonne en-têtes . Ce n'est pas général, c'est incorrect.

0 votes

@MicheldeRuiter c'est toujours incorrect, cela filtrerait plutôt sur les étiquettes d'index !

2voto

GenDemo Points 326

Mon point de vue :

J'ai fait ce qui suit :

sale_method = pd.DataFrame(model_data['Sale Method'].str.upper())
sale_method['sale_classification'] = \
    np.where(sale_method['Sale Method'].isin(['PRIVATE']),
             'private',
             np.where(sale_method['Sale Method']
                      .str.contains('AUCTION'),
                      'auction',
                      'other'
             )
    )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X