1
votes

Faites une boucle sur chaque élément dans une ligne et comparez avec chaque élément d'une autre ligne, puis enregistrez le résultat dans un nouveau column_python

Je veux faire une boucle en python, sur chaque élément d'une ligne contre d'autres éléments de la ligne correspondante d'une autre colonne. Si l'élément n'est pas présent dans la ligne de la deuxième colonne, alors doit être ajouté à la nouvelle liste qui sera convertie dans une autre colonne (cela devrait également éliminer les doublons lors de l'ajout si je ne suis pas en c).

Le but est de comparer éléments de chaque ligne d'une colonne par rapport aux éléments de la ligne correspondante dans une autre colonne et pour enregistrer les valeurs uniques de la première colonne, dans une nouvelle colonne même df.

colonnes df

Ceci est juste un exemple, j'ai beaucoup d'éléments dans chaque ligne

J'ai essayé d'utiliser ce code mais rien ne s'est passé et la conversion de la liste dans la colonne n'est pas correcte d'après ce que j'ai testé

a= df['final_key_concat'].tolist()
b = df['attributes_tokenize'].tolist()
c = []
for i in df.values:
    for i in a:
        if i in a:
            if i not in b:
                if i not in c:
                    c.append(i)
                    print(c)
                    df['new'] = pd.Series(c)

Toute aide est plus que nécessaire, merci à l'avance


3 commentaires

Pourquoi n'écrivez-vous pas simplement vos données et codes ici au lieu de partager des images.


Veuillez ne pas publier votre code sous forme d'image.


vraiment désolé, je viens de modifier ça


3 Réponses :


0
votes

Donc, vu que vous avez ces deux variables, une façon serait:

df['new'] = df.index.map(new)

Essayez quelque chose comme ceci:

new = {}
for index, items in enumerate(a):
    for thing in items:
        if thing not in b[index]:
            if index in new:
                new[index].append(thing)
            else:
                new[index] = [thing]

Ensuite, mappez le dictionnaire vers le df.

a= df['final_key_concat'].tolist()
b = df['attributes_tokenize'].tolist()

Il existe de meilleures façons de le faire, mais cela devrait fonctionner.


6 commentaires

J'ai essayé cela avant aussi, cela n'apporte que les valeurs de final_key_concat dans df ['new_column'], sans exclure les éléments présents dans attribute_tokenize


Merci beaucoup pour votre réponse! Cela prend en fait les caractères non présents dans la deuxième ligne, au moins élimine ce qui n'est pas présent dans la ligne qui doit être comparée mais par caractère et non par mot


Vous devrez publier une partie de votre dataframe dont il est difficile de se passer


Malheureusement, je ne peux pas le poster, ce sont juste les données de l'image dans la description, deux colonnes et l'erreur que j'obtiens après avoir utilisé votre méthode est pour chose dans les éléments: TypeError: l'objet 'float' n'est pas itérable


en remplaçant par str (items) et str (b [index]) cela fonctionne mais encore une fois, la sortie est des caractères pas des mots


Je ne sais pas ce que vous voulez dire, je viens d'exécuter le code et cela fonctionne. Imprimez le nouveau df et vous verrez



0
votes

Cela devrait être ce que vous voulez:

['Camiseta', 'Tecnica', 'hombre', 'barate', 'hombres']

Résultat

import pandas as pd

data = {'final_key_concat':[['Camiseta', 'Tecnica', 'hombre', 'barate'], 
['deportivas', 'calcetin', 'hombres', 'deportivas', 'shoes']],
    'attributes_tokenize':[['The', 'North', 'Face', 'manga'], ['deportivas', 
'calcetin', 'shoes', 'North']]} #recreated from your image

df = pd.DataFrame(data)

a= df['final_key_concat'].tolist() #this generates a list of lists
b = df['attributes_tokenize'].tolist()#this also generates a list of lists
#Both list a and b need to be flattened so as to access their elements the way you want it
c = [itm for sblst in a for itm in sblst] #flatten list a using list comprehension
d = [itm for sblst in b for itm in sblst] #flatten list b using list comprehension

final_list = [itm for itm in c if itm not in d]#Sort elements common to both list c and d

print (final_list)


12 commentaires

Merci beaucoup! Malheureusement, la sortie contient des mots communs et j'ai besoin d'extraire des valeurs uniques de la première colonne (final_key_concat), valeurs qui ne se trouvent pas dans la deuxième colonne


J'ai modifié cette ligne en final_list = [itm for itm in c if itm not in d] #Sort éléments communs aux deux listes c et d et il semble que cela a fonctionné, testera avec plus de données mais je devrai assigner le final liste dans une colonne


@Isa j'ai modifié mon code il y a 13 minutes, il est possible que vous n'ayez pas pris note.


Merci beaucoup! Une dernière question, j'ai essayé d'assigner la liste à une colonne avec df ['new'] = pd.Series (final_list) mais il n'insère que des valeurs dans une seule ligne, une idée de ce que je fais mal? Encore une fois, merci beaucoup pour votre aide


df ['nouveau'] = pd.Series ([liste_finale])


il insère toujours tous les éléments résultants dans une seule ligne


Aussi, lorsque j'utilise mon fichier directement comme df = pd.read_excel (r'C: \ Test2 \ test.xlsx ', encoding =' ISO-8859-1 ') a = df [' final_key_concat ']. Tolist () b = df ['attributes_tokenize']. tolist () le résultat sont des caractères et non des mots comme dans votre exemple lorsque vous avez créé df à partir du dictionnaire


Pourquoi préférez-vous le codage Latin-1 (8859-1) à UTF8?


Parce qu'avec UTF8, mon fichier ne peut pas être lu, renvoie une erreur


Désolé de vous déranger tant @Seyi Daniel, avez-vous une idée de la raison pour laquelle la version que vous avez envoyée fonctionne avec le dictionnaire que vous avez créé mais pas directement avec le fichier? Aussi, comment faire correctement la conversion de liste en colonne? Merci encore pour votre contribution


Vous pouvez partager une partie de votre fichier d'entrée si cela ne vous dérange pas. Peut-être que si j'arrive à voir le contenu, je pourrai donner quelques conseils.


Le fichier que je teste est exactement comme dans l'image, malheureusement je ne peux pas coller les données ici sauf ajouter l'image mais les données ressemblent au dict que vous avez créé lorsque j'utilise votre code renvoie: c = [itm for sblst in a for itm in sblst] TypeError: l'objet 'float' n'est pas itérable Se produit lorsque je lis les données du fichier, en utilisant votre méthode avec le dictionnaire converti en df, cela fonctionne. La nouvelle colonne insère également toute la liste sur une seule ligne



1
votes
    def parse_str_into_list(s):
    if s.startswith('[') and s.endswith(']'):
        return ' '.join(s.strip('[]').strip("'").split("', '"))
    return s

def filter_restrict_words(row):
    targets = parse_str_into_list(row[0]).split(' ', -1)
    restricts = parse_str_into_list(row[1]).split(' ', -1)
    print(restricts)

    # start for loop each words
    # use set type to save words or  list if we need to keep words in order
    words_to_keep = []
    for word in targets:
        # condition to keep eligible words
        if word not in restricts and 3 < len(word) < 45 and word not in words_to_keep:
            words_to_keep.append(word)
            print(words_to_keep)

    return ' '.join(words_to_keep)

df['FINAL_KEYWORDS'] = df[[col_target, col_restrict]].apply(lambda x: filter_restrict_words(x), axis=1)

0 commentaires