我有一个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行只需要访问一次才能执行分组?谢谢!
答案 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