#python #loops #row #items
#python #циклы #ряд #Товары #строка
Вопрос:
Я хочу выполнить цикл на python по каждому элементу из строки против других элементов из соответствующей строки из другого столбца. Если элемент отсутствует в строке второго столбца, то его следует добавить в новый список, который будет преобразован в другой столбец (это также должно устранить дубликаты при добавлении через if i не в c).
Цель состоит в том, чтобы сравнить элементы из каждой строки столбца с элементами из соответствующей строки в другом столбце и сохранить уникальные значения из первого столбца в новом столбце с тем же 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)