2
votes

Catégoriser une colonne `` chaîne '' en fonction du mot de texte qui y est présent en utilisant des catégories prédéfinies dans une autre colonne

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.


2 commentaires

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


3 Réponses :


1
votes
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

1 commentaires

Cette méthode ne gère donc pas plusieurs catégories



4
votes

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


3 commentaires

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/...



1
votes

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)


0 commentaires