J'ai une colonne pandas ayant un domaine de messagerie, quelque chose comme ceci:
AttributeError: 'str' object has no attribute 'str'
et ainsi de suite ....
J'ai les catégories suivantes dans un dataframe séparé :
"emailAddress.str.contains('wire')"
Je veux créer un dataframe qui catégorise les données comme suit:
Sno Domain_IDS category 1 herowire.com contains wire 2 xyzenerergy.com contains energy 3 financial.com others 4 oo-loans.com contains loans 5 okwire.com contains wire 6 cleaneneregy.com contains energy 7 pop-advisors.com contains advisors
J'ai essayé d'utiliser les fonctions lambda et boucle standard utilisant des instructions "if else", en utilisant la clause
Sno category 1 contains wire 2 contains energy 3 contains loans 4 contains advisors
contient, mais j'obtiens l'erreur suivante:
Sno Domain_IDs 1 herowire.com 2 xyzenerergy.com 3 financial.com 4 oo-loans.com 5 okwire.com 6 cleaneneregy.com 7 pop-advisors.com
D'une manière ou d'une autre, je ne suis pas en mesure d'analyser la seule ligne de texte dans le dataframe. Veuillez aider.
3 Réponses :
lst = ["wire", "energy", "loans","advisors"] def fun(a): for i in lst: if i in a: return i return "others" df["category"] = df.Domain_IDs.apply(lambda x: fun(x)) df Sno Domain_IDs category 0 1 herowire.com wire 1 2 xyzenenergy.com energy 2 3 financial.com others 3 4 oo-loans.com loans 4 5 okwire.com wire 5 6 cleanenergy.com energy 6 7 pop-advisors.com advisors
Cette méthode ne gère donc pas plusieurs catégories
Trouvez un modèle dans les domaines, extrayez et créez la catégorie
pat = '('+'|'.join(cat['Sno category'].str.split().str[-1])+')' df['category'] = ('contains ' + df['Domain_IDs'].str.extract(pat)).fillna('other') Sno Domain_IDs category 0 1 herowire.com contains wire 1 2 xyzenenergy.com contains energy 2 3 financial.com other 3 4 oo-loans.com contains loans 4 5 okwire.com contains wire 5 6 cleaneneregy.com other 6 7 pop-advisors.com contains advisors
Merci d'avoir répondu. J'ai une autre question, si vous êtes prêt à répondre. Comment pouvons-nous tirer parti de la PNL pour créer des catégories à elle seule? Comme par exemple, une catégorie non mentionnée ci-dessus est celle des «services», comment créer automatiquement cette catégorie en fonction des heures auxquelles elle est vue dans le domaine. Une idée ?
@KshitijYadav, c'est une question complètement différente. Vous obtiendrez de meilleures réponses si vous postez une nouvelle question pour cela
Bonjour @Vaishali, pourriez-vous m'aider avec cette question: stackoverflow.com/questions/55190428/...
Cette solution permet plusieurs catégorisations:
category common Domain_IDs Sno satisfied 0 wire 0 herowire.com 1 True 4 wire 0 okwire.com 5 True 8 wire 0 wire-loans.com 9 True 10 energy 0 xyzenergy.com 2 True 14 energy 0 cleanenergy.com 6 True 16 energy 0 energy-advisors.com 8 True 21 loans 0 oo-loans.com 4 True 26 loans 0 wire-loans.com 9 True 33 advisors 0 pop-advisors.com 7 True 34 advisors 0 energy-advisors.com 8 True
Donc, filtrer uniquement les catégories qui sont satisfaites:
possibilities[possibilities["satisfied"]]
donne:
categories = pd.DataFrame({"category": ["wire", "energy", "loans", "advisors"]}) domains = pd.DataFrame({"Sno": list(range(1, 10)), "Domain_IDs": [ "herowire.com", "xyzenergy.com", "financial.com", "oo-loans.com", "okwire.com", "cleanenergy.com", "pop-advisors.com", "energy-advisors.com", "wire-loans.com"]}) categories["common"] = 0 domains["common"] = 0 possibilities = pd.merge(categories, domains, how="outer") possibilities["satisfied"] = possibilities.apply(lambda row: row["category"] in row["Domain_IDs"], axis=1)
Qu'en est-il de wire-loans.com ou energy-advisors.com? N'ont-ils qu'une seule catégorie - si oui, laquelle?
quel que soit le mot qui vient en premier fonctionnera pour moi je pense. Cela peut être dans l'une ou l'autre des catégories. Aucune différenciation en tant que telle. Cependant, je serais intéressé de voir comment je peux me différencier en eux. Merci @SourceSimian