迭代分组(Python pandas dataframe)

8

我希望能够按字符串或日期进行分组,并遍历这些分组。

df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
                   'B': ['me', 'you', 'me'] * 2,
                   'C': [5, 2, 3, 4, 6, 9]}) 
groups = df.groupby('A')

例如,在这段代码中,我按照它们的名称“foo”和“bar”对组进行了分组,并且可以使用以下方式循环遍历它们:
for name, group in groups:
   print name

我的问题是我需要在这个循环内部运行另一个循环,并且每次都需要调用不同的一组组。例如(假设组的大小为n)。
for name,group in groups:
   for name1 in range(name, name + 9):  # + 9 to get first 9 groups for every iteration`

由于名称是一个字符串,我无法做到这一点。 简而言之,我只想要一种方法,通过该方法我可以按编号访问组,以便轻松调用所需的组进行计算。 类似于

groups = df.group('A')
for i in range(0,n):
    print group(i)[] + group(i+1)[]  

如果我有以下分组 [g1、g2、g3、g4、g5],我希望按对迭代调用它们,如[g1、g2]、[g2、g3]、[g3、g4]...每次取两个系列的交集。我正在寻找一种通过索引或某些编号来调用分组[g1、g2、..g5]以便我可以将它们用于循环操作的方法。目前唯一我知道的调用组的方法是通过组的名称,就像上面的例子中的'foo'和'bar'。 我想获得这样的操作能力:

for name,group in groups-1:
   print gb.get_group(name)
   print gb.get_group(name+1)

我知道这可能是一个简单的问题,但我已经苦苦挣扎了一段时间。我会非常感激任何形式的帮助。


你实际上想做什么?目前这听起来像是一个XY问题... - Andy Hayden
你需要什么不是很清楚 - 是一次获取任意9个工作组就足够了,还是这些组有某种顺序?如果这些组是有序的,那是因为它们的键是有序的吗? - cphlewis
如果我有以下组[g1,g2,g3,g4,g5],我想要在循环中以配对的方式调用它们,如[g1,g2],[g2,g3],[g3,g4]....并每次取两个序列组的交集。我正在寻找一种通过索引或某些编号来调用组[g1,g2,..g5]的方法,以便我可以将它们用于循环操作。目前,我唯一知道调用组的方法是通过组名,如上例中的“foo”和“bar”。 - Bunny
请提供一些数据(即使是随机的也可以),并给出预期的输出,这将使理解更容易。 - Zero
2个回答

13

.groupby()对象有一个.groups属性,返回一个Python字典,其中包含索引。在这种情况下:

In [26]: df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
   ....:                    'B': ['me', 'you', 'me'] * 2,
   ....:                    'C': [5, 2, 3, 4, 6, 9]})

In [27]: groups = df.groupby('A')

In [28]: groups.groups
Out[28]: {'bar': [1L, 3L, 5L], 'foo': [0L, 2L, 4L]}

您可以按以下方式迭代:

keys = groups.groups.keys()
for index in range(0, len(keys) - 1):
    g1 = df.ix[groups.groups[keys[index]]]
    g2 = df.ix[groups.groups[keys[index + 1]]]
    # Do something with g1, g2

然而,请记住使用for循环遍历Pandas对象通常比向量操作慢。根据您需要完成的任务以及是否需要快速执行,您可能需要尝试其他方法。


0

由于Python 3中的dict_keys不可被下标访问,因此需要更改:

df.ix[groups.groups[keys[index]]]

df.ix[groups.groups[list(keys)[index]]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接