Pytables. 如何遍历唯一值?

3 投票
1 回答
1521 浏览
提问于 2025-04-17 13:51

我有一个数据集,存储在Pytables里,内容大概是这样的:

class myData(IsDescription):
    date = StringCol(16)
    item = Int32Col()

在同一天里,我有多个项目,比如:

'2010-01-01', 5
'2010-01-01', 6
'2010-01-02', 7
'2010-01-02', 8

有没有办法先遍历唯一的日期,然后再遍历该日期下的项目?我想要的效果类似于:

for date in DATE
    print date
     for ITEM
         print item

1 个回答

6

我对Pytables的内部工作原理不太了解(所以这可能不是你想要的),但是在这种情况下,itertools模块里的groupby函数非常有用(注意下面的排序步骤——这一步很重要,因为它可以让groupby把所有同一天的项目分到一起。想了解更多信息,可以查看这里):

In [1]: from itertools import groupby

In [2]: from operator import attrgetter

In [3]: class myData(object):
    def __init__(self, date, item):
        self.date = date
        self.item = item
   ...:         

In [4]: l = [myData('2012-01-01', 'thing'), myData('2012-01-01', 'another thing'), myData('2013-01-01', 'and another')]

In [5]: l_sorted = sorted(l, key=attrgetter('date'))

In [6]: for date, my_objects in groupby(l_sorted, key=attrgetter('date')):
   ...:     print date
   ...:     for obj in my_objects:
   ...:         print obj.item
   ...:         
2012-01-01
thing
another thing
2013-01-01
and another

基本的步骤是先获取一个列表或容器,里面放着你想要分组的对象。接着,你需要根据将要分组的属性(在这个例子中是date)对这个列表进行排序。然后,把这个排序好的列表传给groupby函数,它会在每次迭代中返回两个值——一个key,表示你分组的依据(在这里就是每组的date),还有一个group迭代器,里面包含了所有共享同一个date的对象。接下来,你可以遍历这个组,提取每个对象的item属性。

撰写回答