我有一个唯一行的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
(作为父级)中每一列的每个值,然后将右边的其余列的所有唯一值复制为子级,似乎是实现此目的的一种不好方法。
有没有一种有效的方法?
答案 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()