我在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。
感谢帮助。