2015-05-29 2 views
1

у меня есть панд 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 в отдельную панд dataframe, содержащий все строки в том, что (например, в словарь с ключами 1,2,3 и т. д.). Очевидный способ сделать это - использовать фрагмент (например, df[df.Group == 1]), проходящий через группы.

Однако при очень большом наборе данных (700 тыс. Строк с группами 30 тыс.) Метод среза довольно медленный, так как все транзакции 700 тыс. Должны быть доступны для каждой из 30 тыс. Групп.

Любые предложения по более быстрому методу, когда каждый из 700k строк должен быть доступен один раз для выполнения группировок? Благодаря!

+1

зачем вам это нужно в отдельных наборах данных? –

+0

Мне нужно выполнить ряд операций над каждой группой строк, и для этого мне просто нужны строки из этой группы. В противном случае я в конечном итоге повторяю выполнение операций среза во всем наборе. – David

ответ

2

Я не знаю, почему вы хотите отдельные пеленгации для каждой группы, я только groupby на «группу» и использовать атрибут для индекса groups обратно в ориг ФР, или использовать 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 
+0

очень элегантный, я не знал о 'groups.get_group (...)' – UNagaswamy

+0

Фантастический, 'get_group' был именно тем, что я искал! Благодарю. – David

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

+0

Большое спасибо :-) Я поставил галочку выше, потому что он пришел первым, но это было именно то, что я искал. – David

Смежные вопросы