2
votes

Comment rechercher une trame de données Pandas entière pour une chaîne et obtenir le nom de la colonne qui la contient?

Je veux trouver le nom de la colonne dans un dataframe ("categories") qui contient une chaîne donnée.

categories

    Groceries   Electricity Fastfood    Parking 
0   SHOP        ELCOMPANY   MCDONALDS   park
1   MARKET      ELECT       Subway      car
2   market      electr      Restauran   247 

Dites que je veux rechercher ceci trame de données entière pour la chaîne "MCDO". La réponse devrait être "Fastfood" . J'ai essayé d'utiliser str.contains mais cela ne semble pas fonctionner pour les dataframes.

Comment puis-je y parvenir? Merci.


0 commentaires

4 Réponses :


1
votes

Vous pouvez vérifier avec contient avec n'importe quel

df.apply(lambda x : x.str.contains('MCDO')).any().loc[lambda x : x].index
Index(['Fastfood'], dtype='object')


2 commentaires

Lol, :-),: D, YW


Notez que: df.apply (lambda x: x.str.contains ('MCDO')). Any (). Loc [lambda x: x] .index.item () ne renverrait que le nom de colonne.



1
votes

Ou utilisez:

Fastfood

Résultat:

print(df.apply(lambda x: x.str.contains('MCDO')).replace(False,np.nan).dropna(axis=1,how='all').columns.item())


0 commentaires

2
votes

Si vous pouvez rechercher la chaîne entière, cela facilite la tâche,

df.apply(lambda x: x.str.startswith('MCDO').any()).idxmax()

sinon utilisez apply,

(df == 'MCDONALDS').any().idxmax()


3 commentaires

J'aime beaucoup le premier - il est court et fonctionne parfaitement, ne montrant que "Fastfood" au lieu de "Index (['Fastfood'], dtype = 'object')" de la tentative précédente de lambda.


Quelle a été la première fonction? Vous avez commencé par un "("


@ christfan868, la meilleure façon de comprendre le code serait de le décomposer. df == 'MCDONALDS' renvoie un booléen df, (df == 'MCDONALDS'). any () renvoie True le long de l'axe 0 si la condition est True pour n'importe quelle valeur (d'où le crochet)



1
votes

On peut également utiliser la boucle for pour cela:

['Electricity', 'Fastfood']

Pour obtenir toutes les colonnes qui peuvent avoir la chaîne, par exemple dans le dataframe modifié ci-dessous:

mystr = 'MCDO'
outlist = [ col 
            for col in df 
            for item in df[col]
            if mystr in item    ]
print(outlist)

on peut utiliser la "compréhension de liste":

    Groceries   Electricity  Fastfood    Parking 
0   SHOP        ELCOMPANY   MCDONALDS   park
1   MARKET      MCDON       Subway      car
2   market      electr      Restauran   247 

Sortie:

XXX


2 commentaires

Merci, ça a l'air plutôt sympa même si les gens ont tendance à dire que l'utilisation des boucles for avec Pandas est toujours une erreur. Mais si ça marche, ça marche.


Ils sont faciles à comprendre et assez rapides pour la plupart des applications. Cependant, si vos données sont volumineuses, des approches plus optimisées doivent être utilisées.