Как сопоставить элементы подстроки уникальному элементу в кадре данных?

ionah спросил: 11 марта 2019 в 07:29 в: python

Из списка ~ 500 тыс. строк, состоящих из пар элементов, я пытаюсь создать файл, предназначенный для назначения каждому элементу идентификатора, связанного с группой, к которой он принадлежит. Далее следуют объяснения.

И мне понадобится некоторая помощь, чтобы получить результат разумным и эффективным способом (т. е. питоническим)

==== ==========

что я хочу сделать

преобразовать файл input df0 в желаемый вывод df2

Например, начальный файл будет выглядеть следующим образом (но с 500 тыс. записей), где отношение от item1 к item2 определяется структурой кадра данных.

df0: input

df0 = pd.DataFrame({
"item 1": ['Q', 'R', 'B', 'A'],
"item 2": ['R', 'P', 'A', 'C']
})

Он читается следующим образом: элемент Q связан с элементом R, а элемент R связан с элементом P, следовательно, элемент Q является относится к пункту P (то же самое с A, B и C). В этом случае транзитивность отношений приводит к созданию двух групп элементов.

  • Каждый элемент принадлежит только 1 группе.
  • В реальном файле дела ожидается, что группы могут содержать до 11 элементов.
  • алфавитный порядок не играет роли

Благодаря другим вкладам в stackoverflow, мне удалось сгруппировать все переходные элементы в Отдельные наборы и назначить им один номер группы (или ID). Это означает, что я получаю фрейм данных, который выглядит следующим образом:

df1 = pd.DataFrame({
"items": [{'Q', 'R', 'P'}, {'B', 'A', 'C'} ],
"group": [1, 2]
})

Теперь вышеприведенный результат должен быть преобразован для поддержки последующей обработки данных, и желаемый результат должен выглядеть следующим образом :

df2: желаемый вывод

df2 = pd.DataFrame({
"items": ['Q', 'R', 'P', 'B', 'A', 'C' ],
"group": [1, 1, 1, 2, 2, 2 ]
})

==============

То, что мне удалось до сих пор

шаг 1: преобразовать df1.item в серию отдельных элементов

d = df1.item
e = list(sorted(set(chain.from_iterable(d))))
df2 = pd.DataFrame({'item':e})

шаг 2: vlookup 'df2.items возвращается в df1.group через df1.items

df2['group'] = ''  n = 0
for row in df2.items :
m = 0
for row in df1.items :
    if df2['items'][n] in df1['items'][m]:
        df2['group'][n] = df1['group'][m]
    m = m + 1
n = n + 1

=========== ===

Он работает для небольших таблиц, но не работает на больших фреймах данных.

Я сейчас ищу помощь в отношении:

  • либо лучший код для шага 2 для улучшения df2 (предпочтительно)
  • , либо лучший способ перепрыгнуть через шаг 2 и получить df2 прямо из df1

Заранее большое спасибо за ваше время и отзывы!

0 ответов