2
votes

La colonne contient la colonne

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]


0 commentaires

5 Réponses :


0
votes

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'])


1 commentaires

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!



0
votes

Voici une autre façon de procéder:

df['C'] = (df['B'] == df['A'].str.rstrip('?').str.split(' ').str[-1].astype(int)) * 1


2 commentaires

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.



0
votes

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'])


3 commentaires

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.



2
votes

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


1 commentaires

Je rencontre des problèmes avec ceci, décrit ici: stackoverflow.com/questions / 55972214 / column-contains-column-‌ 1



0
votes

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)