Pytables。如何迭代唯一值?

时间:2013-01-27 20:54:25

标签: python 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 个答案:

答案 0 :(得分:6)

我不熟悉Pytables的内部工作原理(所以这可能不符合您的要求),但groupby模块中的itertools函数非常有用在这些类型的情况下(请注意下面的排序步骤 - 在这种情况下这很重要,以便groupby对具有相同日期的所有项目进行分组。有关详细信息,请参阅here。):

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属性。