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

时间:2018-03-26 12:23:07

标签: python python-3.x pandas hdf5

我想转换此csv文件格式:

csv

进入具有此结构的hdf5文件:

enter image description here

我正在使用熊猫。有没有一种简单的方法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以通过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']})})

答案 1 :(得分:0)

谢谢,我将检查defaultdict。我的解决方案可能更骇人听闻,但如果有人需要一些可定制的东西,则可以这样做:

    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'}}

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