2017-07-07 7 views
0

J'ai l'opération suivante pour ajouter un état indiquant où une chaîne quelconque d'une colonne d'une colonne de données est présente dans une colonne spécifiée d'une autre image. Cela ressemble à ceci:Correspondance insensible à la casse de la série Pandas et correspondance partielle entre les valeurs

df_one['Status'] = np.where(df_one.A.isin(df_two.A), 'Matched','Unmatched') 

Cela ne correspond pas si le cas de chaîne est différent. Est-il possible d'effectuer cette opération tout en étant insensible à la casse?

Aussi, est-il possible retour « appariée » lorsqu'une valeur dans df_one.A se termine par la chaîne complète de df_two.A? par exemple. df_one.A abcdefghijkl -> df_two.A ijkl = 'Correspondant'

+1

Normalement, vous utiliseriez str.casefold pour cela mais je suppose qu'il n'y a pas de version vectorisée de celui-ci. Au lieu de cela, vous pouvez essayer 'df_one ['A']. Str.lower(). Isin (df_two ['A']. Str.lower())' – ayhan

Répondre

1

Vous pouvez effectuer le premier test en convertissant les deux chaînes en minuscules ou majuscules (l'une ou l'autre fonctionne) dans l'expression (car vous ne réaffectez pas la colonne à vos DataFrames, la conversion de cas est temporaire):

df_one['Status'] = np.where(df_one.A.str.lower().isin(df_two.A.str.lower()), 'Matched','Unmatched') 

vous pouvez effectuer votre second test en vérifiant si chaque chaîne en df_one.A se termine par l'une des chaînes dans df_two.A, comme si (en supposant encore voulez une correspondance insensible à la casse):

df_one['Endswith_Status'] = np.where(df_one.A.str.lower().apply(lambda x: any(x.endswith(i) for i in df_two.A.str.lower())), 'Matched','Unmatched')