如何确定有序编号(分层)数据中的叶节点?

时间:2019-05-14 08:17:05

标签: pandas tree hierarchical-data

我在pandas DataFrame中有一列,它代表分层的分类结构,类似于文档中的编号标题。

例如,数据格式如下:

class
'1'
'1.1'
'1.1.1'
'1.1.2'
'1.1.3'
'1.2'
'2'
'2.1'
'2.2'
'2.2.1'
'2.2.2'

我的问题是我正在寻找一种方法来表示数据中的此层次结构,并快速确定哪些行表示层次结构树中的叶节点。请注意,有些叶子在第二层,有些在第三层。

我目前的方法是在句点上分割字符串并扩展列。然后使用结果列设置MultiIndex并对索引进行排序。然后表示了层次结构,但是我不确定是否有确定叶子的快速方法。我正在寻找一种有效的解决方案,该解决方案已经存在,而不是我可能有能力自己编写的复杂的for循环。

我发现一个{'3}}带有一个'isLeaf'函数,该函数对于我的用例来说似乎是完美的,但是我似乎无法通过类似的Python解决方案来实现。

以下是实现我到目前为止所做的代码:

import pandas as pd
my_dict = {1: '0',
 2: '1',
 3: '1.1',
 4: '01.1.1',
 5: '01.1.2',
 6: '01.1.3',
 7: '01.1.4',
 8: '01.1.5',
 9: '01.1.6',
 10: '01.1.7',
 11: '01.1.8',
 12: '01.1.9',
 13: '1.2',
 14: '01.2.1',
 15: '01.2.2',
 16: '2',
 17: '2.1',
 18: '02.1.1',
 19: '02.1.2',
 20: '02.1.3',
 21: '2.2',
 22: '3',
 23: '3.1',
 24: '03.1.2',
 25: '03.1.3',
 26: '03.1.4',
 27: '3.2',
 28: '4',
 29: '4.1',
 30: '4.2'}
# Create Series from Dictionary
class_df = pd.Series(my_dict)
class_df.name = 'class'
# Split column on period and concatenate to DataFrame
class_df = pd.concat([class_df, class_df.str.split('.', expand=True)], axis=1)
# Name columns
cols = ['class', 'level_1', 'level_2', 'level_3']
class_df.columns = cols
level_cols = cols[1:]
#Standardise formate by padding zeros
class_df['level_1'] = class_df['level_1'].str.pad(width=2, side='left', fillchar='0')
# String split creates None values so drop those.
class_df = class_df.fillna('').set_index(level_cols)
class_df = class_df.sort_index()

这是输出像一个Dictionary和一个打印的DataFrame的样子。

{('00', '', ''): '0',
 ('01', '', ''): '1',
 ('01', '1', ''): '1.1',
 ('01', '1', '1'): '01.1.1',
 ('01', '1', '2'): '01.1.2',
 ('01', '1', '3'): '01.1.3',
 ('01', '1', '4'): '01.1.4',
 ('01', '1', '5'): '01.1.5',
 ('01', '1', '6'): '01.1.6',
 ('01', '1', '7'): '01.1.7',
 ('01', '1', '8'): '01.1.8',
 ('01', '1', '9'): '01.1.9',
 ('01', '2', ''): '1.2',
 ('01', '2', '1'): '01.2.1',
 ('01', '2', '2'): '01.2.2',
 ('02', '', ''): '2',
 ('02', '1', ''): '2.1',
 ('02', '1', '1'): '02.1.1',
 ('02', '1', '2'): '02.1.2',
 ('02', '1', '3'): '02.1.3',
 ('02', '2', ''): '2.2',
 ('03', '', ''): '3',
 ('03', '1', ''): '3.1',
 ('03', '1', '2'): '03.1.2',
 ('03', '1', '3'): '03.1.3',
 ('03', '1', '4'): '03.1.4',
 ('03', '2', ''): '3.2',
 ('04', '', ''): '4',
 ('04', '1', ''): '4.1',
 ('04', '2', ''): '4.2'}

                          class
level_1 level_2 level_3        
00                            0
01                            1
        1                   1.1
                1        01.1.1
                2        01.1.2
                3        01.1.3
                4        01.1.4
                5        01.1.5
                6        01.1.6
                7        01.1.7
                8        01.1.8
                9        01.1.9
        2                   1.2
                1        01.2.1
                2        01.2.2
02                            2
        1                   2.1
                1        02.1.1
                2        02.1.2
                3        02.1.3
        2                   2.2
03                            3
        1                   3.1
                2        03.1.2
                3        03.1.3
                4        03.1.4
        2                   3.2
04                            4
        1                   4.1
        2                   4.2

预期的输出是,我想为布尔值树返回一个布尔序列,对于层次结构树中的叶子行,否则为False。

感谢帮助。

0 个答案:

没有答案