使用 pandas 将 table 直接转换为树结构

Converting table directly to tree structure with pandas

我想转换这个csv文件格式:

转换成具有这种结构的 hdf5 文件:

我正在使用 Pandas。有简单的方法吗?

为此,您可以通过 collections.defaultdict 使用嵌套词典:

from collections import defaultdict
import pandas as pd

# read csv file
# df = pd.read_csv('input.csv', header=None)

df = pd.DataFrame([['A', 'a', 'a1'],
                   ['A', 'a', 'a2'],
                   ['A', 'b', 'b1'],
                   ['A', 'b', 'b2'],
                   ['A', 'c', 'c1'],
                   ['A', 'c', 'c2']],
                  columns=['col1', 'col2', 'col3'])

d = defaultdict(lambda: defaultdict(list))

for row in df.itertuples():
    d[row[1]][row[2]].append(row[3])

结果

defaultdict(<function __main__.<lambda>>,
            {'A': defaultdict(list,
                         {'a': ['a1', 'a2'],
                          'b': ['b1', 'b2'],
                          'c': ['c1', 'c2']})})

谢谢,我会查看 defaultdict。我的解决方案可能更 hacky,但如果有人需要可定制的东西:

    cols = ['col1', 'col2', 'col3']
    children = {p : {} for p in cols}
    parent = {p : {} for p in cols}

    for x in df.iterrows():
        for i in range(len(cols)-1):
            _parent = x[1][cols[i]]
            _child = x[1][cols[i+1]]

            parent[cols[i+1]].update({_child : _parent})
            if _parent in children[cols[i]]:
                children_list = children[cols[i]][_parent]
                children_list.add(_child)
                children[cols[i]].update({_parent : children_list})
            else:
                children[cols[i]].update({_parent : set([_child])})

结果:

    parent =
    {'col1': {},
     'col2': {'a': 'A', 'b': 'A', 'c': 'A'},
     'col3': {'a1': 'a', 'a2': 'a', 'b1': 'b', 'b2': 'b', 'c1': 'c', 'c2': 'c'}}

然后您可以在层次结构中上下移动。