Перебирайте каждый элемент в строке и сравнивайте с каждым элементом из другой строки, затем сохраните результат в новом column_python

#python #loops #row #items

#python #циклы #ряд #Товары #строка

Вопрос:

Я хочу выполнить цикл на python по каждому элементу из строки против других элементов из соответствующей строки из другого столбца. Если элемент отсутствует в строке второго столбца, то его следует добавить в новый список, который будет преобразован в другой столбец (это также должно устранить дубликаты при добавлении через if i не в c).

Цель состоит в том, чтобы сравнить элементы из каждой строки столбца с элементами из соответствующей строки в другом столбце и сохранить уникальные значения из первого столбца в новом столбце с тем же df.

столбцы df

Это всего лишь пример, у меня очень много элементов в каждой строке

Я пытался использовать этот код, но ничего не произошло, и преобразование списка в столбец неверно из того, что я тестировал

 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)
  

Любая помощь более чем необходима, заранее спасибо

Комментарии:

1. Почему бы вам просто не написать здесь вставить свои данные и коды вместо обмена изображениями.

2. Пожалуйста, не размещайте свой код в виде изображения.

3. действительно сожалею об этом, я просто изменил это

Ответ №1:

Итак, поскольку у вас есть эти две переменные, одним из способов было бы:

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

Попробуйте что-то вроде этого:

 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]
  

Затем сопоставьте словарь с df.

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

Есть лучшие способы сделать это, но это должно сработать.

Комментарии:

1. Я тоже пробовал это раньше, он только переносит значения из final_key_concat в df[‘new_column’], не исключая элементы, присутствующие в attribute_tokenize

2. Большое спасибо за ваш ответ! Это фактически использует символы, отсутствующие во второй строке, по крайней мере, устраняет то, чего нет в строке, которая сравнивается, но по символу, а не по слову

3. Вам придется опубликовать часть вашего фрейма данных, без которого трудно обойтись

4. К сожалению, я не могу опубликовать его, это просто данные из изображения в описании, два столбца и ошибка, которую я получаю после использования вашего метода, для thing в items: TypeError: объект ‘float’ не может быть повторен

5. замена на str (элементы) и str(b[индекс]) работает, но опять же, выводятся символы, а не слова

Ответ №2:

Это должно быть то, что вы хотите:

 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)
  

Результат

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

Комментарии:

1. Большое спасибо! К сожалению, вывод содержит общие слова, и мне нужно извлечь уникальные значения из первого столбца (final_key_concat), значения, которые не найдены во втором столбце

2. Я изменил эту строку на final_list = [itm для itm в c, если itm не в d] #Сортируйте элементы, общие для обоих списков c и d, и, похоже, это сработало, протестирую с большим количеством данных, но мне придется назначить окончательный список столбцу

3. @Isa я изменил свой код 13 минут назад, возможно, вы не обратили внимания.

4. огромное спасибо! Последний вопрос, я попытался присвоить список столбцу с df[‘new’] = pd.Series(final_list), но он вставляет значения только в одну строку, есть идеи, что я делаю не так? Опять же, большое спасибо за вашу помощь

5. df[‘new’] = pd.Series([final_list])

Ответ №3:

     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)