Преобразование уникальных строк DataFrame в древовидную структуру в Python - PullRequest
0 голосов
/ 01 марта 2019

У меня есть пандас DataFrame с уникальными строками, который выглядит примерно так:

df = pd.DataFrame({'O': ['O-1','O-1'],
                       'B': ['B-1','B-2'],
                       'C': ['C-1','C-2'],
                       'R': ['R-1','R-1']}, 
                       columns = ['O', 'B', 'C', 'R'])

Столбцы df упорядочены в линейном отношении родитель-потомок, где столбец O - это уровень 1, столбецB это уровень 2 и так далее.Намерение состоит в том, чтобы преобразовать эту df в древовидную структуру для целей навигации, которая будет выглядеть примерно так:

output = pd.DataFrame({'PARENT': ['O-1','O-1','O-1','O-1','O-1','B-1','B-1','B-2','B-2','C-1','C-2'],
                       'CHILD_TYPE': ['B','B','C','C','R','C','R','C','R','R','R'],
                       'CHILD': ['B-1','B-2','C-1','C-2','R-1','C-1','R-1','C-2','R-1','R-1','R-1']},
                        columns = ['PARENT', 'CHILD_TYPE', 'CHILD'])

Фильтрация по каждому значению каждого столбца в df (как родительский элемент), а затем копированиевсе уникальные значения оставшихся столбцов справа от дочернего элемента кажутся плохим способом достижения этого.

Есть ли эффективный способ?

1 Ответ

0 голосов
/ 02 марта 2019

Как я уже говорил, у нас есть способ добиться этого:

Фильтрация каждого значения каждого столбца в df (как родительский) и затем копирование всех уникальных значений оставшихся столбцов справа, как кажется дочерним.как плохой способ добиться этого.

И решение с той же логикой здесь:

sample = pd.DataFrame({'O': ['O-1','O-1'],
                   'B': ['B-1','B-2'],
                   'C': ['C-1','C-2'],
                   'R': ['R-1','R-1']}, columns = ['O', 'B', 'C', 'R'])

ls = []
for col in sample:
    for val in sample[col]:
        fs = sample[sample[col] == val]
        fvl = fs.iloc[:,fs.columns.get_loc(col)+1:].T.values.tolist()
        fcl = fs.iloc[:,fs.columns.get_loc(col)+1:].columns.tolist()
        for fc, fvs in zip(fcl, fvl):
            for fv in fvs:
                ls.append([val,fc,fv])

output = pd.DataFrame(ls, columns = ['PARENT', 'CHILD_TYPE', 'CHILD']).drop_duplicates()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...