2 votes

Vérifiez si une colonne contient une valeur d'une autre colonne et remplissez une troisième colonne (Vrai ou Faux)

Je voudrais vérifier si une colonne contient une valeur d'une autre colonne et remplir une troisième colonne avec Vrai ou Faux.

df in:

id | name  | account
-------------------
01 | John  | AB01
02 | Emma  | AB03
03 | Alice | AB03

df out:

id | name  | account | match
----------------------------
01 | John  | AB01    | True
02 | Emma  | AB03    | False
03 | Alice | AB03    | True

J'ai essayé ceci:

df['match'] = np.where(df['account'].contains(df['id']), 'True','False')

Erreur: AttributeError: 'Series' object has no attribute 'contains'

df['match'] = np.where(df['account'].str.contains(df['id']), 'True','False')

Erreur: TypeError: 'Series' objects are mutable, thus they cannot be hashed

Toute aide est grandement appréciée!

3voto

jezrael Points 290608

Pour tester si des valeurs par ligne contiennent apply avec in

Pour booléen True, False:

df['match'] =  df.apply(lambda x: x['id'] in x['account'], axis=1)

Pour les chaînes de caractères 'True', 'False':

df['match'] =  np.where(df.apply(lambda x: x['id'] in x['account'], axis=1), 'True','False')

print (df)
   id   name account  match
0  01   John    AB01   True
1  02   Emma    AB03  False
2  03  Alice    AB03   True

MODIFIER:

Il manque des valeurs, donc une solution possible est d'utiliser np.nan == np.nan est False, donc j'ai ajouté une déclaration if-else:

print (df)
   id   name account
0  01   John    AB01
1  02   Emma     NaN
2  03  Alice    AB03

Pour booléen True, False:

df['match'] = df.apply(lambda x: x['id'] in x['account'] 
                                 if x['account'] == x['account'] 
                                 else False, axis=1)   

Pour les chaînes de caractères 'True', 'False':

df['match'] = np.where(df.apply(lambda x: x['id'] in x['account'] 
                                          if x['account'] == x['account'] 
                                          else False, axis=1), 'True','False')
print (df)
   id   name account  match
0  01   John    AB01   True
1  02   Emma     NaN  False
2  03  Alice    AB03   True

Une autre option est d'utiliser une fonction personnalisée avec une déclaration try-except:

def test(x):
    try:
        return x['id'] in x['account']
    except Exception:
        return False

Pour booléen True, False:

df['match'] = df.apply(test, axis=1)

Pour les chaînes de caractères 'True', 'False':

df['match'] = np.where(df.apply(test, axis=1), 'True','False')

0voto

Kshitij Saxena Points 223

Quelque chose comme ça?

df['match'] = df.apply(lambda x: x.account.str.contains(str(x.id)), axis=1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X