Добавление столбца в Dataframe, содержащий символ родительского узла - PullRequest
0 голосов
/ 29 мая 2019

Я использую объемные данные (список действительных символов CPC) с веб-сайта CPC .Я прочитал csv в pandas df, и первые 30 строк (более 260 КБ):

    SYMBOL  level   not-allocatable additional-only
1   A   2   True    False
2   A01 4   True    False
3   A01B    5   True    False
4   A01B 1/00   7   False   False
5   A01B 1/02   8   False   False
6   A01B 1/022  9   False   False
7   A01B 1/024  9   False   False
8   A01B 1/026  9   False   False
9   A01B 1/028  9   False   False
10  A01B 1/04   9   False   False
11  A01B 1/06   8   False   False
12  A01B 1/065  9   False   False
13  A01B 1/08   9   False   False
14  A01B 1/10   9   False   False
15  A01B 1/12   9   False   False
16  A01B 1/14   9   False   False
17  A01B 1/16   8   False   False
18  A01B 1/165  9   False   False
19  A01B 1/18   9   False   False
20  A01B 1/20   8   False   False
21  A01B 1/22   8   False   False
22  A01B 1/222  9   False   False
23  A01B 1/225  10  False   False
24  A01B 1/227  9   False   False
25  A01B 1/24   8   False   False
26  A01B 1/243  9   False   False
27  A01B 1/246  9   False   False
28  A01B 3/00   7   False   False
29  A01B 3/02   8   False   False

Значение уровня создает иерархию.Таким образом, узел A01B 1/00 ​​является уровнем 7 и потомком A01B.A01B 1/02 - это уровень 8, а дочерний элемент A01B 1/00 ​​и A01b 3/00 - дочерний элемент A01B.

Мне нужен способ создания нового столбца с именем PARENT, который содержитSYMBOL прямого родителя узла.Например, я отредактировал CSV в Excel, чтобы показать желаемый результат первых нескольких строк:

The dataframe after adding the parent column

Примечание : нет символов уровня 1, 3 или 6.Есть несколько символов уровня 2.Для символов уровня 2 нет родительского элемента, родительскому элементу символов уровня 4 может быть назначен первый символ уровня 2 над ним, а родительскому элементу символов уровня 7 также может быть назначен символ первого уровня 5 над ним.

РЕДАКТИРОВАТЬ: мне нужно лучше объяснить, как определить родителя узла.Значение уровня и положение строки - все, что необходимо для определения родителя. Tree showing parents and children

Я хотел бы использовать панд для выполнения работы, но я не уверен, какначать.Любой берущий?Спасибо

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Вот еще один метод. GetParent () возвращает функцию, которая отслеживает самый последний символ для каждого уровня и возвращает родителя текущего уровня. Использование его в pandas.apply () создает столбец с родительскими символами.

def GetParent():
    #            0  1  2  3  4  5  6  7  8  9  10
    hierarchy = [0, 0, 0, 0, 2, 4, 0, 5, 7, 8, 9]
    parent = [' ']*11

    def func(row):
        #print(row)
        symbol,level = row[['SYMBOL', 'level']]

        parent_level = hierarchy[level]
        parent_symbol = parent[parent_level]

        parent[level] = symbol

        return pd.Series([parent_symbol], index=['parent'])

    return func

# create a column with the parents
parents = df.apply(GetParent(), axis=1)
df = pd.concat([df, parents], axis=1)

df

Выход:

    SYMBOL  level   na      ao      parent
0   A           2   True    False   
1   A01         4   True    False   A
2   A01B        5   True    False   A01
3   A01B 1/00   7   False   False   A01B
4   A01B 1/02   8   False   False   A01B 1/00
5   A01B 1/022  9   False   False   A01B 1/02
6   A01B 1/024  9   False   False   A01B 1/02
7   A01B 1/026  9   False   False   A01B 1/02
8   A01B 1/028  9   False   False   A01B 1/02
9   A01B 1/04   9   False   False   A01B 1/02
10  A01B 1/06   8   False   False   A01B 1/00
11  A01B 1/065  9   False   False   A01B 1/06
12  A01B 1/08   9   False   False   A01B 1/06
...
1 голос
/ 13 июня 2019

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

С этой гипотезой мы можем для каждой строки взять ближайшую строку с уровнем ниже строки:

import pandas as pd

data={"Symbol":["A", "A01", "A01B", "A01B 1/00", "A01B 1/02", "A01B 1/022", "B"], "level":[2,4,5,7,8,9,2]}

df=pd.DataFrame(data=data)
df['Parent'] = ''

for index, row in df.iterrows():
    # We look at the potential parents
    potential_parents = df.loc[df.index.isin([x for x in range(index)]) & (df['level'] < row['level']), 'Symbol']
    # And we take the last one as our parent
    if len(potential_parents) == 0: 
        df.loc[index, 'Parent'] = ''
    else:
        df.loc[index, 'Parent'] = potential_parents.iloc[-1]

Выход:

       Symbol  level     Parent
0           A      2           
1         A01      4          A
2        A01B      5        A01
3   A01B 1/00      7       A01B
4   A01B 1/02      8  A01B 1/00
5  A01B 1/022      9  A01B 1/02
6           B      2           
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...