WedX - журнал о программировании и компьютерных науках

Найти совпадающие подстроки в двух кадрах данных

У меня есть два фрейма данных:

[in]print(training_df.head(n=10))

[out]
                          product_id
transaction_id                      
0000001                   [P06, P09]
0000002         [P01, P05, P06, P09]
0000003                   [P01, P06]
0000004                   [P01, P09]
0000005                   [P06, P09]
0000006                   [P02, P09]
0000007         [P01, P06, P09, P10]
0000008                   [P03, P05]
0000009                   [P03, P09]
0000010         [P03, P05, P06, P09]

[in]print(testing_df.head(n=10))

[out]
                     product_id
transaction_id                 
001                       [P01]
002                  [P01, P02]
003             [P01, P02, P09]
004                  [P01, P03]
005             [P01, P03, P05]
006             [P01, P03, P07]
007             [P01, P03, P08]
008                  [P01, P04]
009             [P01, P04, P05]
010             [P01, P04, P08]

Каждая строка в testing_df является возможной «подстрокой» строки в training_df. Я хотел бы найти все совпадения и вернуть возможные списки training_df для каждого списка в файле testing_df. Было бы полезно, если бы я мог вернуть словарь, где ключи — это transaction_id из testing_df, а значения — все возможные «совпадения» в training_df. (Каждый список в training_df должен быть на одно значение длиннее, чем соответствующий список в test_df).

Я попытался:

# Find the substrings that match
matches = []

for string in training_df:
    results = []
    for substring in testing_df:
        if substring in string:
            results.append(substring)
    if results:
        matches.append(results)  

Однако это не работает, оно возвращает только имя столбца «product_id».

Я также пробовал:

# Initialize a list to store the matches between incomplete testing_df and training_df
matches = {}

# Compare the "incomplete" testing lists to the training set
for line in testing_df.product_id:
    for line in training_df.product_id:
        if line in testing_df.product_id in line in training_df.product_id:
            matches[line] = training_df[training_df.product_id.str.contains(line)]

Однако это вызывает ошибку TypeError: unhashable type: 'list'


  • Думаю проблема в скобках. Например, P01 является подстрокой [P01, P06], а [P01] — нет. Вы можете попробовать substring[1:-1] вместо substring, чтобы избавиться от скобок. 02.08.2017
  • @csander Я пробовал matches = [] for string in training_df[1:-1]: results = [] for substring in testing_df[1:-1]: if substring in string: results.append(substring) if results: matches.append(results), но это тоже не сработало 02.08.2017
  • Нет, вы не хотите нарезать DataFrame, вы хотите нарезать подстроку 02.08.2017
  • По-прежнему возвращается только имя столбца [['product_id']] 02.08.2017

Ответы:


1

Думаю проблема в скобках. Проблема в том, что in проверяет, находится ли элемент в списке, а не является ли один список подмножеством другого. Вы можете преобразовать два списка в наборы, а затем проверить, являются ли они подмножествами друг друга. Вы также можете использовать расширенную индексацию, чтобы сохранить transaction_id:

training_df = pd.DataFrame([
    ['0000001', ['P06', 'P09']],
    ['0000002', ['P01', 'P05', 'P06', 'P09']],
    ['0000003', ['P01', 'P06']],
    ['0000004', ['P01', 'P09']],
    ['0000005', ['P06', 'P09']],
    ['0000006', ['P02', 'P09']],
    ['0000007', ['P01', 'P06', 'P09', 'P10']],
    ['0000008', ['P03', 'P05']],
    ['0000009', ['P03', 'P09']],
    ['0000010', ['P03', 'P05', 'P06', 'P09']],
], columns=['transaction_id', 'product_id'])

testing_df = pd.DataFrame([
    ['001', ['P01']],
    ['002', ['P01', 'P02']],
    ['003', ['P01', 'P02', 'P09']],
    ['004', ['P01', 'P03']],
    ['005', ['P01', 'P03', 'P05']],
    ['006', ['P01', 'P03', 'P07']],
    ['007', ['P01', 'P03', 'P08']],
    ['008', ['P01', 'P04']],
    ['009', ['P01', 'P04', 'P05']],
    ['010', ['P01', 'P04', 'P08']],
], columns=['transaction_id', 'product_id'])

matches = {}
for testing_id in testing_df.product_id:
    testing_id_set = set(testing_id)
    contains_id = training_df.product_id.apply(lambda id: testing_id_set.issubset(set(id)))
    matches[str(testing_id)] = contains_id
02.08.2017
  • Файлы testing_df и training_df уже отформатированы как фреймы данных pandas. Когда я пытаюсь matches = {} for testing_id in testing_df.product_id: matches[testing_id] = training_df[training_df.product_id.str.contains(testing_id[1:-1])], он просто возвращает пустой словарь 02.08.2017
  • Я включил определения, чтобы показать данные, которые я тестировал. Если это не работает для вас, как выглядят ваши фреймы данных? 02.08.2017
  • Скобки находятся снаружи, поэтому, например, строка 1, transaction_id 001, столбец product_id выглядит следующим образом: ['P01','P02','P03'] 02.08.2017
  • Хорошо, я обновил ответ, чтобы принять это во внимание. 03.08.2017
  • Я попробую это, но посмотрите на этот вопрос ссылка Я немного обновил задачу 03.08.2017
  • Я был неправ, это работает, но очень медленно. Более того, он продолжает убивать мое ядро. 04.08.2017
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]