Как я могу получить уникальные записи из фрейма данных, например: в первом случае мы понимаем, что многие из них перекрываются и, следовательно, их не нужно учитывать в окончательном выводе. Я чувствую, что это, возможно, проблема поиска подстроки, но мне неясно, какой подход может быть хорошим.
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
Определите лямбда-функцию для объединения уникальных подстрок в каждой группе
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)
Сгруппируйте DataFrame по столбцу «id» и примените лямбда-функцию к столбцу «filepath».
res = expected.groupby('id')['filepath'].apply(unique_substrings).reset_index()
print(res)
извините, перепутал входы! должно работать сейчас
Вот один из вариантов:
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
хм спасибо! Однако это, похоже, не может привести к ожидаемому результату.