Pytables. 如何遍历唯一值?
我有一个数据集,存储在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
属性。