在pandas中重复提取行组的有效方法

时间:2015-05-29 09:26:12

标签: python pandas

我有一个pandas DataFrame看起来像下面这样:

Group   Date    Value   etc.
1       01/01   10
1       05/01   10
1       08/01   5
1       15/01   5
1       18/01   2
1       21/01   10
...
2       02/01   3
2       15/01   4
2       25/01   1
...
3       01/01   6
....

我想将每个Group提取到一个单独的pandas数据框中,该数据框包含该组中的所有行(例如,带有密钥1,2,3的字典等)。显而易见的方法是使用切片(如df[df.Group == 1])循环遍历各组。

然而,对于非常大的数据集(700k行,具有30k组),切片技术非常慢,因为必须为每个30k组访问整个700k事务。

对更快方法的任何建议,其中每个700k行只需要访问一次才能执行分组?谢谢!

2 个答案:

答案 0 :(得分:2)

我不知道你为什么要为每个小组单独设置一个df,我只是groupby在'组'并使用groups属性索引回原点df,或使用get_group

In [79]:
groups = df.groupby('Group')
groups.groups

Out[79]:
{1: [0, 1, 2, 3, 4, 5], 2: [6, 7, 8], 3: [9]}

In [81]:    
groups.get_group(1)

Out[81]:
   Group   Date  Value
0      1  01/01     10
1      1  05/01     10
2      1  08/01      5
3      1  15/01      5
4      1  18/01      2
5      1  21/01     10

In [82]:    
df.loc[groups.groups[1]]

Out[82]:
   Group   Date  Value
0      1  01/01     10
1      1  05/01     10
2      1  08/01      5
3      1  15/01      5
4      1  18/01      2
5      1  21/01     10

答案 1 :(得分:1)

您可以在groupby列上使用Group。这将为您提供所有组,您将能够使用函数处理每个组 -

df.groupby('Group').<apply function here>

例如 -

In [13]: df
Out[13]: 
    Group   Date  Value
0       1  01/01     10
1       1  05/01     10
2       1  08/01      5
3       1  15/01      5
4       1  18/01      2
5       1  21/01     10
6       2  15/01      5
7       2  18/01      2
8       1  21/01     10
9       1  15/01      5
10      5  18/01      2
11      5  21/01     10

In [14]: df.groupby('Group').groups
Out[14]: {1: [0, 1, 2, 3, 4, 5, 8, 9], 2: [6, 7], 5: [10, 11]}

In [15]: grp = df.groupby('Group')

这可以获得第1组:

In [16]: grp.get_group(1)
Out[16]: 
   Group   Date  Value
0      1  01/01     10
1      1  05/01     10
2      1  08/01      5
3      1  15/01      5
4      1  18/01      2
5      1  21/01     10
8      1  21/01     10
9      1  15/01      5

此处的文档将进一步帮助您 - http://pandas.pydata.org/pandas-docs/dev/groupby.html