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.
4 Réponses :
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')
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.
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())
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()
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)
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
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.