2017-04-02 3 views
-2

Je travaille avec le fichier Excel où une colonne contient "Description" (= chaînes c'est-à-dire "abc_123") et j'ai besoin de créer des catégories basées sur la description. Je ai vérifié Fuzzywuzzy lib, mais il ne convient pas tout à fait à mes besoins, car la description peut être assez longue et la catégorie peut être décrite par un mot, donc le taux de discordance est assez élevé.Python - retourne la valeur de dict si la cellule contient la sous-chaîne

Comment je l'ai fait dans Excel (sensible à la casse):

=IFERROR(INDEX($B$2:$B$50,MATCH(1,--NOT(NOT(FIND($A$2:$A$50,B2))),0)),"N/A") 

La chose est en python mes solutions ne renvoient que des correspondances exactes et je voudrais revenir même des correspondances partielles (insensible à la casse si possible).

df = pd.DataFrame({'col1': {0: 'a', 1: "b", 2: "abc"}, 'col2': {0: np.nan, 1: np.nan, 2: np.nan}}) 
di = {"a": "1", "b":"2"} 

    col1 col2 
0 a NaN 
1 b NaN 
2 abc NaN 

df.loc[df.col1.isin(di), 'col2'] = df['col1'].map(di) 

col1 col2 
0 a 1 
1 b 2 
2 abc NaN 

Je voudrais col2: 2 à être renseignés avec "1", car il est le premier match (a).

modifier: dictionnaire - dict { "Hosp": "Hôpital", "emerg": "Hôpital", "Fire": "service d'incendie"}

J'aimerais:

" Hôpital d'urgence "pour retourner" Hôpital "

" Hospi_emrgncy. " retourner "Hôpital"

"d'urgence Hopsital" retourner "Hôpital"

"Fire in Detroit" retourner "Fire Department"

+0

Je suis désolé, mais votre question n'est pas claire. Pouvez-vous fournir plus de données d'échantillon et la production attendue? –

+0

Cela ressemble à un travail d'apprentissage automatique. Préparez un jeu de données d'exemples, alimentez-le à un algorithme de classification, puis laissez-le essayer de classer vos données restantes. Un bon point de départ serait de regarder scikit apprendre –

Répondre

0
for key, value in category_name.items(): 
    mask = np.column_stack([df['Description'].str.contains(key, na=False) for col in df]) 
    df2 = df.loc[mask.any(axis=1)] 
    df2["Category"] = df2["Category"].fillna(value) 
    df3 = df3.combine_first(df2) 

a finalement trouvé la solution. En aucun cas parfait, mais cela fait l'affaire si j'ai assez bon dictionnaire.