首页 > 解决方案 > 向包含父节点符号的数据框添加列

问题描述

我正在使用来自CPC 网站的批量数据(CPC 有效符号列表) 。我已将 csv 读入 pandas df,前 30 行(超过 260K)是:

    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节点的直接父级。例如,我在 Excel 中编辑了 csv 以显示前几行的所需结果:

添加父列后的数据框

注意:没有 1、3 或 6 级符号。有多个 2 级符号。2 级符号没有父级,4 级符号的父级可以分配其上方的第一个 2 级符号,7 级符号的父级同样可以分配其上方的第一个 5 级符号。

编辑:我需要更好地解释如何确定节点的父节点。级别值和行位置是确定父级所需的全部内容。显示父母和孩子的树

我想使用 pandas 来完成这项工作,但我不知道如何开始。有接盘侠吗?谢谢

标签: pythonpandastree

解决方案


在这个答案中,我假设您的直接父母始终在您自己的上方,因为这是您的预期输出和图表所暗示的。

有了这个假设,我们可以对每一行取最近的行,其级别低于该行:

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           

推荐阅读