Python Pandas объединяет 3 столбца списков в один столбец

#python #pandas

#python #pandas

Вопрос:

У меня есть 3 столбца с ключевыми словами, которые были получены с помощью разных алгоритмов.

данные выглядят примерно так

описание продукта1 ключевые слова2 ключевые слова3

ProductX, «бла-бла», [iot, интернет, облако], [облако, интернет, управление энергопотреблением], [интернет вещей, облако, интернет]

Как мне объединить 3 столбца ключевых слов в один, а также удалить все дубликаты, например, ключевые слова «облако» должны храниться только один раз?

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

1. пожалуйста, отправьте образец фрейма данных с ожидаемым результатом

Ответ №1:

используйте set()

 import pandas as pd

df = pd.DataFrame({'c1':[['a', 'c']], 'c2':[['a', 'd']]})
df['c3'] = (df['c1']   df['c2']).apply(set).apply(list)

df
 
     c1      c2      c3
0   [a, c]  [a, d]  [d, a, c]
 

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

1. Просто чтобы добавить немного информации о том, «почему ваш ответ — лучший подход», pandas в основном используются при использовании векторизации. Использование цикла for или любого другого последовательного подхода замедлит процесс, а также не даст преимуществ от использования pandas.

2. Использование этого, похоже, также добавляет пустые поля в список… как убедиться, что он не добавляет их, или как мне удалить их из окончательного списка?

3. что вы подразумеваете под пустыми полями? Например, [«, ‘a’] ?

Ответ №2:

Вы можете применить функцию к фрейму данных, которая устанавливает пересечение между тремя столбцами.

 df['updatedKeywords'] = df.apply(lambda row: set(row['keyword1']) amp; set(row['keyword2'] amp; set(row['keyword3']), axis=1)
 

Если у вас было много столбцов для пересечения, вы могли бы расширить его:

 columnsToIntersect = ['keyword'   str(i) for i in range(numberOfKeywordColumns)]
df['updatedKeywords'] = df.apply(lambda row: set.intersection(*[set(row[x]) for x in columnsToIntersect], axis=1)
 

Наконец, вы также можете использовать pandas.DataFrame.aggregate, хотя это может быть излишним для такого рода задач.