Панды: агрегировать до самого длинного набора

Как я могу получить уникальные записи из фрейма данных, например: в первом случае мы понимаем, что многие из них перекрываются и, следовательно, их не нужно учитывать в окончательном выводе. Я чувствую, что это, возможно, проблема поиска подстроки, но мне неясно, какой подход может быть хорошим.

df = pd.DataFrame({"id": [1, 1, 1, 1, 1, 1, 2, 2],
                   "filepath": ['src', 'src/abc', 'src/abc/cde',
'src/abc/cde/main', 'src/abc/cde/main/detach', 'dl/path',
                            'src', 'dl/path']})

   id                 filepath
0   1                      src
1   1                  src/abc
2   1              src/abc/cde
3   1         src/abc/cde/main
4   1  src/abc/cde/main/detach
5   1                  dl/path
6   2                      src
7   2                  dl/path
expected = pd.DataFrame({"id": [1, 2],
                         "filepath": ['src/abc/cde/main/detach, dl/path', 'src, dl/path']})

   id                          filepath
0   1  src/abc/cde/main/detach, dl/path
1   2                      src, dl/path
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. Определите лямбда-функцию для объединения уникальных подстрок в каждой группе

    def longest_unique_paths(paths):
        sorted_paths = sorted(paths, key=lambda x: len(x), reverse=True)
        result = []
    
        for path in sorted_paths:
            if not any(path.startswith(p + '/') for p in result):
                result.append(path)
    
        return ', '.join(result)
    
  2. Сгруппируйте DataFrame по столбцу «id» и примените лямбда-функцию к столбцу «filepath».

    res = expected.groupby('id')['filepath'].apply(unique_substrings).reset_index()
    
    print(res)
    

хм спасибо! Однако это, похоже, не может привести к ожидаемому результату.

John Stud 14.04.2023 05:00

извините, перепутал входы! должно работать сейчас

user7247147 14.04.2023 05:40
Ответ принят как подходящий

Вот один из вариантов:

out = (df.assign(filepath=df["filepath"].str.split("/"))
            .explode("filepath").drop_duplicates(keep = "last")
            .groupby(level=0).agg({"id": "first", "filepath": "/".join})
            .groupby("id", as_index=False).agg(", ".join)
)

Выход : ​

print(out)

   id                          filepath
0   1  src/abc/cde/main/detach, dl/path
1   2                      src, dl/path

Другие вопросы по теме

Текстовый параметр Plotly гистограммы не работает
Как сохранить среднее значение и стандартное отклонение (STD) в CSV-файле pandas
Как динамически объединять несколько столбцов, где имена столбцов хранятся в виде строки с разделителями Pandas
Нарезать фрейм данных с определенным условием
Разделите фрейм данных на основе логического условия, умножьте на константу и присвойте значения обратно фрейму данных. Не работает
Pandas to_csv, но удалите NaN на уровне отдельной ячейки, не удаляя полную строку или столбец
Как я могу преобразовать словарь, содержащий ключ и значение в виде списка, в фрейм данных panda с одним столбцом для ключей и одним столбцом для значений?
Импорт нескольких файлов .cnv, извлечение имени файла и присоединение в виде столбца
Как изменить определенные значения столбца в фрейме данных?
Прочитайте HDF - Работа с иерархией через Pandas