Определение дублированных групп в pandas

Вопрос или проблема

Определение дублированных групп в pandas

Предположим, у меня есть следующие данные

df = pd.DataFrame({
    'task_id': [1, 1, 1, 1, 2, 2, 2, 2],
    'job_id': [1, 1, 2, 2, 0, 0, 1, 1],
    'filename': ['filename1', 'filename2', 'filename33', 'filename2342', 'filename1', 'filename2', 'filename33', 'filename5']
})
   task_id  jobs_id      filename
0        1        1     filename1
1        1        1     filename2
2        1        2    filename33
3        1        2  filename2342
4        2        0     filename1
5        2        0     filename2
6        2        1    filename33
7        2        1     filename5

Я хочу определить пары (task_id и jobs_id), которые содержат ровно одни и те же имена файлов (ни больше, ни меньше имен файлов). В моем случае результаты должны быть [((1, 1), (2, 0), )], так как они содержат ровно (filename1, filename2).

Я полагаю, что мне нужно сгруппировать и затем использовать frozenset, как

df.groupby(['task_id', 'jobs_id'])['filename'].apply(lambda x: frozenset(x))
task_id  jobs_id
1        1              (filename1, filename2)
         2          (filename33, filename2342)
2        0              (filename1, filename2)
         1             (filename33, filename5)
Name: filename, dtype: object
tmp = (df.groupby(['task_id', 'job_id'])['filename']
         .agg(frozenset)[lambda x: x.duplicated(keep=False)]
)

out = pd.DataFrame(tmp.index).groupby(tmp.values)[0].agg(tuple)

out

(filename2, filename1)    ((1, 1), (2, 0))
Name: 0, dtype: object

Ответ или решение

Для решения задачи идентификации дублированных групп в заданном DataFrame, можно воспользоваться возможностями библиотеки Pandas. Главной целью является нахождение пар (task_id, job_id), которые имеют точно одинаковые наборы названий файлов. Обратите внимание, что в данной задаче мы будем использовать frozenset, чтобы игнорировать порядок элементов и обеспечить уникальность наборов.

Ниже представлена полная пошаговая реализация этой задачи:

  1. Импортируйте необходимую библиотеку.
  2. Создайте DataFrame.
  3. Группируйте данные по task_id и job_id и преобразуйте список файлов в frozenset.
  4. Идентифицируйте дублированные наборы frozenset.
  5. Сформируйте итоговый результат.

Вот пример кода, который выполняет вышеуказанные шаги:

import pandas as pd

# Создание DataFrame
df = pd.DataFrame({
    'task_id': [1, 1, 1, 1, 2, 2, 2, 2],
    'job_id': [1, 1, 2, 2, 0, 0, 1, 1],
    'filename': ['filename1', 'filename2', 'filename33', 'filename2342', 'filename1', 'filename2', 'filename33', 'filename5']
})

# Группировка DataFrame и преобразование файлов в frozenset
tmp = (df.groupby(['task_id', 'job_id'])['filename']
       .agg(frozenset)[lambda x: x.duplicated(keep=False)]
)

# Сборка окончательных результатов
# Создание DataFrame из индексов и группировка по значению frozenset
out = pd.DataFrame(tmp.index).groupby(tmp.values)[0].agg(tuple)

# Вывод результата
print(out)

В результате выполнения данного кода мы получим следующее:

(frozenset({'filename1', 'filename2'}),)    ((1, 1), (2, 0))
Name: 0, dtype: object

Объяснение кода:

  1. Импорт pandas: Библиотека Pandas используется для работы с табличными данными.
  2. Создание DataFrame: Инициализируем DataFrame с данными.
  3. Группировка и преобразование: Используем функцию groupby, чтобы сгруппировать записи по task_id и job_id, затем собираем названия файлов в frozenset.
  4. Идентификация дубликатов: Проверяем, какие наборы frozenset повторяются, используя функцию duplicated().
  5. Формирование выходного результата: Преобразуем итоговые результаты в удобный формат, который легко интерпретировать.

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

Оцените материал
Добавить комментарий

Капча загружается...