Общее совпадение строк во фрейме данных pandas - PullRequest
1 голос
/ 20 января 2020

Имеет фрейм данных 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...