【问题标题】:Converting table directly to tree structure with pandas使用 pandas 将表直接转换为树结构
【发布时间】:2018-09-04 14:17:20
【问题描述】:

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

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

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

【问题讨论】:

  • 你看过这个pandas
  • 我正在阅读它,但我似乎无法找到我要找的东西。
  • @ArturMüllerRomanov,看起来你想要的只是一个嵌套字典。为什么要 HDF5 存储它? HDF5 通常适用于大数据或可传输性。
  • @jpp 你认为这是错误的方法吗?我的任务是计算另一个 hdf5 中属于 a、b 或 c 的所有数据集。但是,此信息在上面的 csv 中给出。所以我想我应该将 csv 转换为 hdf5 并合并两个 hdf5。
  • 根据我的经验,HDF5 的目的是存储(用于内存不足计算;可传输性)。对于计算本身,您应该尽可能在内存中,通过pandasnumpy 等执行它们。我不知道您的数据有多大,所以我不知道是什么会为你工作。

标签: python python-3.x pandas hdf5


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    谢谢,我去看看 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'}}
    

    然后你就可以在你的层次结构中上下走动了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多