Je voudrais voir si dans chaque ligne de mon dataframe la colonne A contient la valeur qui se trouve dans la colonne B.
TypeError: 'Series' objects are mutable, thus they cannot be hashed
J'ai essayé:
'C': [1,0,0]
5 Réponses :
J'ai trouvé que cela fonctionne comme une fonction:
def fun (A,B): if str(B) in A: return 1 else: return 0 f = np.vectorize(fun, otypes=[float]) df["C"] = f(df['A'],df['B'])
Les réponses au code uniquement sont déconseillées sur StackOverflow, vous pourriez peut-être inclure pourquoi OP a fait une erreur et ce que cela fait pour la corriger. Merci!
Voici une autre façon de procéder:
df['C'] = (df['B'] == df['A'].str.rstrip('?').str.split(' ').str[-1].astype(int)) * 1
Bien que cette réponse fonctionne, elle est trop spécifique. Autrement dit, cela ne fonctionnera que sur les chaînes où le numéro prévu est le dernier mot de la colonne et non si la chaîne était "54321 est mon numéro" par exemple.
Oui, l'exemple donné est trompeur en ce sens.
Vous pouvez simplifier le code:
df["C"] = [int(str(B) in A) for A, B in zip(df['A'],df['B'])]
Ou utiliser la compréhension de liste:
def fun (A,B): return str(B) in str(A) # Edit: A to str(A) f = np.vectorize(fun, otypes=[int]) df["C"] = f(df['A'],df['B'])
Attention: cette méthode retournera 'True' quand 'A' vaut "Is it 22?" et «B» est «2».
@ kevins_1 - oui, il teste les chiffres.
J'aime la version simplifiée de ma tentative. C'est la compréhension de la liste qui teste les chiffres.
Alternativement :
df['C']=df.A.str.contains(r'\b(?:{})\b'.format('|'.join(df.B.astype(str)))).astype(int) print(df) A B C 0 Is it 54321? 54321 1 1 Is it 4321? 54321 0 2 Is it 321? 54321 0
Je rencontre des problèmes avec ceci, décrit ici: stackoverflow.com/questions / 55972214 / column-contains-column- 1
J'avais accepté différentes réponses sur ce fil mais j'avais des problèmes avec elles, comme décrit ici: La colonne contient la colonne 1
Merci à Wen-Ben pour cette réponse:
Si vous voulez que 12 soit en 123:
df = df.dropna() df['C'] = [str(y) in x for x , y in zip(df.A.str.split(' '),df.B)] print(df)
Ou si vous ne voulez pas que 12 soit en 123:
df = df.dropna() df['C'] = [str(y) in x for x , y in zip(df.A,df.B)] print(df)