Как объединить строки, каждая из которых представляет собой список строк .. исключая дубликаты - PullRequest
0 голосов
/ 02 января 2019

Я работаю с музыкальными данными и мне нужно кодировать жанровые классификации для алгоритма регрессии, python 3 pandas.Я хотел бы закодировать категории в 0 или 1, если классифицированы по жанру.Данные находятся во фрейме данных Pandas и содержат повторяющиеся значения.Я хочу объединить все строки в один список уникальных значений, а затем использовать get_dummies для кодирования каждой записи.

1-я попытка:

for i in x:
    a = genres + list(i)
    genres.append(a)

2-я попытка:

x = list of genres (like below)
[j for i in x for j in i]

list(itertools.chain(x))

ввод:

строка 1 = ['hip hop', 'rock','pop rock','country']

строка 2 = ['pop', 'rock', 'pop rock' ,'alternative rock']

ожидаемый результат:

new list = ['hip hop', 'rock','country','pop','pop rock','alternative rock']

Финалвывод

      | hip hop | rock | country | pop | pop rock | alternative rock |
row 1 |   1     | 1    |  1      | 0   | 1        |  0               |
row 2 |   0     | 1    |  0      | 1   | 1        |  1               |

1 Ответ

0 голосов
/ 02 января 2019

Если порядок элементов не важен, вы можете рассматривать каждый список как set , найти union и затем преобразовывать обратно в список:

def merge(r1, r2):
    return list(set().union(r1, r2))


row_1 = ['hip hop', 'rock','pop rock','country']
row_2 = ['pop', 'rock', 'pop rock' ,'alternative rock']

print(merge(row_1, row_2))

Вывод

['pop rock', 'alternative rock', 'country', 'hip hop', 'rock', 'pop']

Однако, если порядок (внешний вид) имеет значение, вы можете сделать следующее:

from itertools import chain

def merge_with_order(r1, r2):

    seen = set()
    result = []
    for e in chain(r1, r2):
        if e not in seen:
            seen.add(e)
            result.append(e)

    return result


row_1 = ['hip hop', 'rock','pop rock','country']
row_2 = ['pop', 'rock', 'pop rock' ,'alternative rock']

print(merge_with_order(row_1, row_2))

Вывод

['hip hop', 'rock', 'pop rock', 'country', 'pop', 'alternative rock']

Если вы предпочитаете однострочное использование, рассмотрите возможность использования collection.OrderedDict :

from itertools import chain
from collections import OrderedDict


def merge_with_order(r1, r2):
    return list(OrderedDict.fromkeys(chain(r1, r2)))
...