在Python中将唯一的DataFrame行转换为树结构

时间:2019-03-01 15:29:19

标签: python dataframe tree

我有一个唯一行的pandas 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 :(得分:0)

正如我提到的,我们有这种方法可以实现:

  

过滤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()