Имеет фрейм данных pandas, содержащий несколько (unix) записей пути, которые имеют общий root.
Примечание : root определяется как кратчайший возможный путь, существующий в списке, например: foo / bar для foo / bar и foo / bar / baz, как foo / bar. Не так, как ожидается, foo для foo / bar и foo / bar / baz , так как foo отсутствует в данном столбце path
.
Как эффективно определить root для каждой записи?
Создание выборочных данных
import pandas as pd
from io import StringIO
import numpy as np
sample_data = StringIO(
"""
path
foo/bar/baz
foo/bar
foo/bar/baz/foo1
foo/baz
another/path
another/path/one/more/level
another/path/one
"""
)
df = pd.read_csv(sample_data)
df["root"] = "None" #prepare a column for the root
Результирующий фрейм данных (df
) выглядит так:
path root
0 foo/bar/baz None
1 foo/bar None
2 foo/bar/baz/foo1 None
3 foo/baz None
4 another/path None
5 another/path/one/more/level None
6 another/path/one None
Требуемый вывод
path root
0 foo/bar/baz foo/bar
1 foo/bar foo/bar
2 foo/bar/baz/foo1 foo/bar
3 foo/baz foo/baz
4 another/path another/path
5 another/path/one/more/level another/path
6 another/path/one another/path
Что я использовал
for i, d in df.iterrows():
df.root = np.where(df.path.str.contains(d.path), d.path, df.root)
Вывод правильный. Тем не менее, я бы хотел избежать зацикливания отдельных записей в df
.